Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. The actual shuffle operation is performed by interleaving a chip from S1 with a chip from S2 as shown below for C = 5: The single resultant stack, S12, contains 2 * C chips. The bottommost chip of S12 is the bottommost chip from S2. On top of that chip, is the bottommost After the shuffle operation, S12 is split into 2 new stacks by taking the bottommost C chips from S12 to form a new S1 and the topmost C chips For this problem, you will write a program to determine if a particular resultant stack S12 can be formed by shuffling two stacks some number of times. Input The first line of input contains a single integer N, (1 ≤ N ≤ 1000) which is the number of datasets that follow. Each dataset consists of four lines of input. The first line of a dataset specifies an integer C, (1 ≤ C ≤ 100) which is the number of chips in each initial stack (S1 and S2). Output Output for each dataset consists of a single line that displays the dataset number (1 though N), a space, and an integer value which is the minimum number of shuffle operations required to get the desired resultant stack. If the Sample Input 2 4 AHAH HAHA HHAAAAHH 3 CDE CDE EEDDCC Sample Output 1 2 2 -1 按照要求模拟一遍,注意分配的顺序。模拟退火呀 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<limits.h> #include<map> using namespace std; char s1[110],s2[110]; char s[110*2]; int n,c; int main() { cin>>n; for(int t=1;t<=n;t++) { cin>>c>>s1>>s2>>s; map<string,bool>visit;//标志映射 visit[s]=true; int step=0; while(true) { char str[110*2]; int len=0; for(int i=0;i<c;i++) { str[len++]=s2[i]; str[len++]=s1[i]; } str[len]='\0'; step++; if(!strcmp(str,s)) { cout<<t<<" "<<step<<endl; break; } else if(visit[str]&&strcmp(str,s))//出现过但又不是目标状态退出 { cout<<t<<" "<<-1<<endl; break; } visit[str]=true; for(int i=0;i<c;i++) s1[i]=str[i];//发s1 s1[c]='\0'; for(int i=c,k=0;i<2*c;i++) s2[k++]=str[i];//发s2 s2[c]='\0'; } } return 0; } |
POJ 3087 Shuffle'm Up(模拟退火),布布扣,bubuko.com
POJ 3087 Shuffle'm Up(模拟退火)