码迷,mamicode.com
首页 > 其他好文 > 详细

Gym 100553J Jokewithpermutation(dfs)

时间:2015-07-11 22:43:09      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

题意:有n个数(n<=50)写在一行,将两数之间的空格去掉得到一个数字串。根据这个数字串回复原数;

思路:先求数的个数,当串长度小于10时,均为个位数;当串长度大于9时,存在两位数,剪去9个个位数,同样得到数的个数;

        数的个数也是串中的最大数;

        采用枚举的方法将每个数与串中的位置匹配,属于同一个数的数字对应同一个数;

        输出时,两位数的数字间不加空格;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[105];
int len,mark;
int vis[505];
void dfs(int n)
{
    if(n==0)
    {
        mark=1;return;
    }
    if(mark) return;
    if(n>=10)
    {
        char temp1=n/10+0;
        char temp2=n%10+0;
        for(int i=0;i<len-1;i++)
        {
            if(!vis[i]&&!vis[i+1]&&str[i]==temp1&&str[i+1]==temp2)
            {
                vis[i]=n;
                vis[i+1]=n;
                 dfs(n-1);
                 if(mark) return;
                 vis[i]=0;
                 vis[i+1]=0;
            }
        }

    }
    else{
        for(int i=0;i<len;i++)
        {
            if(!vis[i]&&(str[i]-0)==n)
            {
                vis[i]=n;
                 dfs(n-1);
                 if(mark) return;
                 vis[i]=0;
            }
        }
    }
}
int main()
{
    int i,j,k,num;
    freopen("joke.in","r",stdin);
    freopen("joke.out","w",stdout);
    while(scanf("%s",&str)!=EOF)
    {
        len=strlen(str);
        memset(vis,0,sizeof(vis));
        mark=0;
        if(len<10)
        {
            num=len;
        }
        else
            num=(len-9)/2+9;
        dfs(num);
        printf("%c",str[0]);
        for(i=1;i<len;i++)
        {
            if(vis[i]==vis[i-1])
                printf("%c",str[i]);
            else printf(" %c",str[i]);
        }printf("\n");
    }
    return 0;
}

 

Gym 100553J Jokewithpermutation(dfs)

标签:

原文地址:http://www.cnblogs.com/dashuzhilin/p/4639403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!