标签:搜索
小蒜头又调皮了。这一次,姐姐的实验报告惨遭毒手。
姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔。但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 1 到 100 的且首部没有空格的数字串。
现在姐姐已经怒了,蒜头找你写个程序快点把试验数据复原。
输入
输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。
字符串的长度在 1 到 100 之间。
输出
输出共一行,为姐姐的原始测试数据—— 1 到 n 的输出。
任意两个数据之间有一个空格。
输入:
4111109876532
输出:
4 1 11 10 9 8 7 6 5 3 2
#include<stdio.h> #include<string.h> #include<vector> using namespace std; int flag[105],ok,vist[105],len; vector<int>loc[60]; char s[105]; void dfs(int num){ if(num==0){ ok=1; int i=0; do{ printf("%c",s[i]); i++; }while(flag[i]==0); while(i<len){ printf(" "); do{ printf("%c",s[i]); i++; }while(flag[i]==0); } printf("\n"); return ; } for(int i=loc[num].size()-1; i>=0; i--){ int j=loc[num][i]; if(num<=9){ if(vist[j]==0) { vist[j]=1; flag[j]=1; dfs(num-1); if(ok)return ; vist[j]=0; flag[j]=0; } } else if(vist[j]==0&&vist[j+1]==0) { vist[j]=vist[j+1]=1; flag[j]=1; dfs(num-1); if(ok)return ; vist[j]=vist[j+1]=0; flag[j]=0; } } } int main(){ while(scanf("%s",s)>0){ len=strlen(s); int maxnum; ok=0; memset(vist,0,sizeof(vist)); memset(flag,0,sizeof(flag)); flag[len]=1; if(len<=9) maxnum=len; else maxnum=(len-9)/2+9; for(int i=1; i<=maxnum; i++){ loc[i].clear(); for(int j=0; j<len; j++) if(i<=9){ if(s[j]-'0'==i) loc[i].push_back(j); } else if(i==(s[j]-'0')*10+s[j+1]-'0'&&j+1<len) loc[i].push_back(j); } dfs(maxnum); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:搜索
原文地址:http://blog.csdn.net/u010372095/article/details/46877889