题意就是把一段序列拆成从1到n的形式
一开始暴力了一下 后来发现bug太多一定是思路不对……
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<map> #include<vector> #include<queue> #define M(a,b) memset(a,b,sizeof(a)) #define N(a) a-'0' using namespace std; char s[205]; int way[205]; bool vis[205]; int n; int lenss; bool ok; void dfs(int pos,int num){ if(pos==lenss){ ok=true; for(int i=1;i<=n;i++) printf("%d%s",way[i],i==n?" ":" "); return ; } if(!vis[N(s[pos])]&&N(s[pos])<=n){ vis[N(s[pos])]=1; way[num]=N(s[pos]); dfs(pos+1,num+1); vis[N(s[pos])]=0; if(ok) return ; } if(pos+1<lenss&&!vis[(s[pos]-'0')*10+(s[pos+1]-'0')]&&(s[pos]-'0')*10+(s[pos+1]-'0')<=n){ vis[(s[pos]-'0')*10+(s[pos+1]-'0')]=1; way[num]=(s[pos]-'0')*10+(s[pos+1]-'0'); dfs(pos+2,num+1); vis[(s[pos]-'0')*10+(s[pos+1]-'0')]=0; if(ok) return ; } } int main(){ while(gets(s)){ int lens=strlen(s); M(vis,0); M(way,0); vis[0]=1; n=0; lenss=0; ok=false; while(true){ n++; if(n<10) lenss++; else lenss+=2; if(lenss==lens) break; } ok=0; dfs(0,1); } return 0; } /* 4111109876532 */