题目大意:有两堆筹码(poker chip)S1 S2;每一次shuffle操作是指将S1 S2依次交叉叠放,形成了S12;叠放之后的split操作是指,将S12最底部的C个chip形成新的S1,余下的C个chip形成新的S2。如此往复,求形成目标的S12所需的最少次数。
直接用模拟就可以了。需要注意的是,判断循环终止条件。如果新形成的S1与输入的S1相等,说明经过若干次shuffle之后,回到了初始状况,说明这是一个死循环,形成不了目标的S12。还可以通过判断S12是否之前出现过,若出现过,即说明循环为死循环。
源代码:
3087 | Accepted | 212K | 0MS | C++ | 721B | 2013-09-29 10:24:28 |
#include<iostream> #include<string> using namespace std; int main() { string s1,s2,result,temp1,temp2,temp; int N,len,i,j,steps; scanf("%d",&N); for(i=1;i<=N;i++) { scanf("%d",&len); cin>>s1>>s2>>result; steps=1; temp1=s1; temp2=s2; while(1) { temp=""; for(j=0;j<len;j++) /*shuffle operation*/ { temp+=temp2[j]; temp+=temp1[j]; } if(temp==result) { printf("%d %d\n",i,steps); break; } else { for(j=0;j<len;j++) /*split*/ { temp1[j]=temp[j]; temp2[j]=temp[j+len]; } if(temp1==s1) { printf("%d -1\n",i); break; } steps++; } } } return 0; }
题目大意:求解Caesar密码所对应的明文。
输入比较麻烦,对C、C++的输入函数的区别比较模糊,等有空好好研究下。用cin.ignore( )处理输入START的回车。
源代码:
1298 | Accepted | 204K | 0MS | C++ | 573B | 2013-09-29 15:07:42 |
#include<iostream> #include<string> using namespace std; int main() { string ciphertext,line; int i; while(cin>>line) { cin.ignore(); if(line=="START") { getline(cin,ciphertext); for(i=0;i<ciphertext.length();i++) { if(ciphertext[i]>='F'&&ciphertext[i]<='Z') printf("%c",ciphertext[i]-5); else if(ciphertext[i]>='A'&&ciphertext[i]<='E') printf("%c",ciphertext[i]+21); else printf("%c",ciphertext[i]); } printf("\n"); cin>>line; } if(line=="ENDOFINPUT") break; } return 0; }