cf NEERC 14 J - Jokewithpermutation

来源:互联网 发布:小米电视怎么设置网络 编辑:程序博客网 时间:2024/06/05 00:44

J - Jokewithpermutation

题意为输入一串数字字符,为1~n的数字,目的就是将这1~n的数字输出,数字之间加空格
由于数字最多有50个,因此数字最大是两位数
首先用公式求出n,只存在一位数时 length=s.length(字符串长度)
用公式 length=9 存在两位数时 length1=length+(n-length)*2
类推有三位数为length2=length1+(n-length1)*3;
然后从大到小枚举每个数用dfs深搜找到适合的数标记一下

#include <cstdio>#include <cstring>char str[550];int num[550];int vis[550];bool flag=false;int n,len;void dfs(int x){    int i;   if(x==0){     flag=true;     return;   }   if(flag==true)       return;   if(x>9){                  //找两位数的时候      for(i=1;i<len;i++){        int x1=x/10;        int x2=x%10;            //分别比较        if(vis[i]==0&&vis[i+1]==0)            if(x1==num[i]&&x2==num[i+1]){                  vis[i]=x;                vis[i+1]=x;                dfs(x-1);  //条件符合进行递归                if(flag==true)                    return;                vis[i]=0;   //条件不符合回溯,取消标记                vis[i+1]=0;            }     }   }   else{             //一位数       for(i=1;i<=len;i++)      if(vis[i]==0&&x==num[i]){        vis[i]=x;        dfs(x-1);        if(flag==true)            return;        vis[i]=0;      }   }} int main(){    freopen("joke.in","r",stdin);    freopen("joke.out","w",stdout);    scanf("%s",str+1);    flag=false;    memset(vis,-1,sizeof(vis));    memset(num,-1,sizeof num);    len=strlen(str+1);    for(int i=1;i<=len;i++){      num[i]=str[i]-'0';      vis[i]=0;    }     if(len<=9){    //只有个位数直接输出        printf("%d",num[1]);        for(int i=2;i<=len;i++)            printf(" %d",num[i]);        puts("");     }     else{     n=(len-9)/2+9;    // printf("%d\n",n);     dfs(n);     for(int i=2;i<=len+1;i++){  //输出         if(vis[i-1]==vis[i]){             if(i>2)                 printf(" ");             printf("%d%d",num[i-1],num[i]);             i++;         }         else{             if(i==2)             printf("%d",num[i-1]);             else{               printf(" %d",num[i-1]);             }         }     }     puts("");     }    return 0;}
0 0
原创粉丝点击