F - Shuffle'm Up
题意:
给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12。
将字符串s1和s2通过一定的变换变成s12,找到变换次数
变换规则如下:
假设s1=12345,s2=67890
变换后的序列 s=6172839405
如果s和s12完全相等那么输出变换次数
如果不完全相等,s的前半部分作为s1,后半部分作为s2,重复上述过程。
#include<bits/stdc++.h> using namespace std; #define maxn 25 int gra[maxn][maxn],ans[maxn]; bool vis[maxn]; int u,m,sum; void dfs(int cnt) { if(cnt==20&&ans[cnt]==m) { sum++; cout<<sum<<": "<<m; for(int i=1; i<=20; i++) cout<<" "<<ans[i]; cout<<endl; return ; } if(cnt>20) return ; for(int i=1; i<=20; i++) { if(gra[ans[cnt]][i]==1&&!vis[i]) { ans[cnt+1]=i; vis[i]=1; dfs(cnt+1); vis[i]=0; } } } int main() { memset(gra,0,sizeof(gra)); for(int i=1; i<=20; i++) for(int j=0; j<3; j++) { cin>>u; gra[i][u]=1; } while(cin>>m) { if(m==0) break; memset(vis,0,sizeof(vis)); sum=0; ans[0]=m; dfs(0); } return 0; }