Joke with permutation

来源:互联网 发布:总舵主软件 编辑:程序博客网 时间:2024/05/21 18:38

Joke with permutation
Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:65536KB
Total submit users: 87, Accepted users: 60
Problem 13341 : Special judge
Problem description

Joey had saved a permutation of integers from 1 to n in a text file. All the numbers were written as decimal numbers without leading spaces.

Then Joe made a practical joke on her: he removed all the spaces in the file.

Help Joey to restore the original permutation after the Joe’s joke!

Input

The input file contains a single line with a single string — the Joey’s permutation without spaces.

The Joey’s permutation had at least 1 and at most 50 numbers.

Output

Write a line to the output file with the restored permutation. Don’t forget the spaces!

If there are several possible original permutations, write any one of them.

Sample Input
4111109876532

Sample Output
4 1 11 10 9 8 7 6 5 3 2

Problem Source
NEERC 2014
题意是给出一个全排列的字符串,然后让你确定排列两个元素之间的空格位置。
先根据字符串的长度求出n是多大,然后用dfs搜索符合条件的排列。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define maxn 500using namespace std;int n,l,cnt;int flag[maxn];char str[maxn];int hash[maxn];bool ll; void dfs(int k)//k表示当前处理到哪个字符{        if(ll)        return ;        if(k>=n)        {        for(int i=0;i<n;i++)        {            printf("%c",str[i]) ;            if(flag[i]&&i!=n-1)            printf(" ");          } //当K>n时,输出排列,return         ll=1;         return ;         }        if(!hash[str[k]-'0']&&(k+1>=n||str[k+1]!='0'))//一个字有两种组合,要么自己组成一个数,要么和后面的字符组成两位数,注意组合完之后, 字符串的第一个不能是零        {            hash[str[k]-'0']=1;            flag[k]=1;            dfs(k+1);            flag[k]=0;//整数不可取,回退            hash[str[k]-'0']=0;        }       if(!hash[(str[k]-'0')*10+str[k+1]-'0']&&((str[k]-'0')*10+(str[k+1]-'0'))<=cnt&&(str[k+2]!='0'||k+2>=n))           {              hash[(str[k]-'0')*10+str[k+1]-'0']=1;           flag[k+1]=1;           dfs(k+2);           flag[k+1]=0;           hash[(str[k]-'0')*10+str[k+1]-'0']=0;    }               }int main(){    while(scanf("%s",str)!=EOF)    {        n=strlen(str);        if(n<=9)        {            for(int i=0;i<n-1;i++)            printf("%c ",str[i]);            printf("%c\n",str[n-1]);             continue;         }            int num=n-9;        cnt=9+num/2;        ll=0;         memset(hash,0,sizeof(hash));        memset(flag,0,sizeof(flag));        dfs(0);        printf("\n");    }    return 0;}
0 0
原创粉丝点击