題意:給定s1,s1兩副撲克,順序從下到上。依次將s2,s1的撲克一張一張混合。例如s1,ABC; s2,DEF. 則第一次混合後為DAEBFC. 然後令前半段為s1, 後半段為s2. 如果可以變換成所給出的字符串,輸出變換次數即可;否則,輸出-1。
這題數據太水了,我是這樣判斷無法變換成題目所給出的字符串的:將每一次變換後的字符串存進數組,每次變換後由於之前變換後的字符串相比較,如果有相同的,就說明會無限循環下去。這樣一來,循環次數會增加很多,然而0ms過了。。。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char ss[1000][200]; int main() { //freopen("in.txt","r",stdin); int n; scanf("%d",&n); int t=1; while(n--) { int m; bool flag=false; char s1[200],s2[200],s[400]; memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); memset(s,0,sizeof(s)); memset(ss,0,sizeof(ss)); scanf("%d%s%s%s",&m,s1,s2,s); for(int i=0;; i++) { for(int j=0; j<m; j++) ss[i][2*j]=s2[j]; for(int j=0; j<m; j++) ss[i][2*j+1]=s1[j]; if(strcmp(s,ss[i])==0) { printf("%d %d\n",t,i+1); break; } else { for(int j=0; j<i; j++) if(strcmp(ss[i],ss[j])==0) { printf("%d -1\n",t); flag=true; break; } if(flag) break; } for(int j=0; j<m; j++) { s1[j]=ss[i][j]; s2[j]=ss[i][j+m]; } } t++; } return 0; }