描述
有n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:○●○●○●○●○●
任务:编程打印出移动过程。
格式
输入格式
输入n。
输出格式
移动过程。
样例
输入样例
7
输出样例
step 0:ooooooo*******–
step 1:oooooo–o
step 2:oooooo*–o*
step 3:ooooo–oo
step 4:ooooo–oo
step 5:oooo–ooo
step 6:oooo***–ooo*
step 7:ooo–oooo*
step 8:oooo**–ooo*
step 9:o–o**ooooo*
step10:ooo*–oooo
step11:–ooooooo*
限制
时间限制: 1000 ms
内存限制: 65536 KB
int m;
void tiaoqi(char s[],int n,int bol){
printf("step%2d:%s\n",m,s);
m++;
int len=strlen(s);
if(n==0) return;
else if(n<=4){
if(n==4)
s[3]='*',s[4]='o',s[7]=s[8]='-';
else if(n==3)
s[1]=s[2]='-',s[7]=s[8]='o';
else if(n==2)
s[1]='*',s[2]='o',s[6]=s[7]='-';
else if(n==1)
s[0]=s[1]='-',s[6]='o',s[7]='*';
tiaoqi(s,n-1,0);
}else{
if(bol==1){
for(int i=0;i<len-1;i++){
if(s[i]=='-'&&s[i+1]=='-'){
s[i]='o';
s[i+1]='*';
break;
}
}
for(int i=0;i<len-1;i++){
if(s[i]=='o'&&s[i+1]=='*'){
s[i]='-';
s[i+1]='-';
break;
}
}
tiaoqi(s,n-1,0);
}else{
for(int i=0;i<len-1;i++){
if(s[i]=='-'&&s[i+1]=='-'){
s[i]='*';
s[i+1]='*';
break;
}
}
for(int i=0;i<len-2;i++){
if(s[i]=='*'&&s[i+1]=='*'&&s[i+2]=='o'){
s[i]='-';
s[i+1]='-';
break;
}
}
tiaoqi(s,n-1,1);
}
}
}
int main(){
int n;cin>>n;
char qp[2*n+3];
for(int i=0;i<n;i++){
qp[i]='o';qp[2*n-i-1]='*';
}
qp[2*n]='-',qp[2*n+1]='-',qp[2*n+2]='\0';
//for(int i=0;i<=2*n+1;i++) printf("%c",qp[i]);
tiaoqi(qp,2*n-3,1);
return 0;
}