题目:[递归算法]棋子移动
题目描述
有2n个棋子(n>=4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如图(n=5):00000*****
移动棋子的规则是:每次必须同时移动相邻两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:__00000*
输入
仅输入黑棋和白棋的数目n(4<=n<=1000)。
输出
以后各行输出每一步的移动结果,最后一行输出总步数。其中用’O’(大写字母)表示白棋,用’ * ’表示黑棋。’_”(下划线)表示一个空位。
样例输入
5
样例输出
OOOO_ O
OOOO* O*
OOO OO
OOOO** O
O O**OOO*
OOO* _OO
_ _OOOOO*
step=7
Cake 1#
#include<cstdio>
using namespace std;
char q[10010];
int n;
void chess(int k)
{
if(k==4)
{
q[4]='_';
q[5]='_';
q[9]='O';
q[10]='*';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
q[4]='*';
q[5]='O';
q[8]='_';
q[9]='_';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
q[2]='_';
q[3]='_';
q[8]='O';
q[9]='O';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
q[2]='*';
q[3]='O';
q[7]='_';
q[8]='_';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
q[1]='_';
q[2]='_';
q[7]='O';
q[8]='*';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
}
else
{
q[k]='_';
q[k+1]='_';
q[2*k+1]='O';
q[2*k+2]='*';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
q[k]='*';
q[k+1]='*';
q[2*k-1]='_';
q[2*k]='_';
for(int i=1;i<=2*n+2;i++)
{
printf("%c",q[i]);
}
printf("\n");
return chess(k-1);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
q[i]='O';
}
for(int i=n+1;i<=2*n;i++)
{
q[i]='*';
}
q[2*n+1]='_';
q[2*n+2]='_';
chess(n);
printf("step=%d",2*n-3);
return 0;
}
Cake 2#
#include<iostream>
#include<cstdio>
using namespace std;
char ch[6666];
int s=0,sp,n;
void dfs_2(int k)
{
for(int i=0;i<=1;i++)
{
ch[sp+i]=ch[k+i];
ch[k+i]='_';
}
sp=k;
s++;
for(int i=1;i<=2*n+2;i++)
cout<<ch[i];
cout<<endl;
}
void dfs_1(int n)
{
if(n==4)
{
dfs_2(4);
dfs_2(8);
dfs_2(2);
dfs_2(7);
dfs_2(1);
}
else
{
dfs_2(n);
dfs_2(2*n-1);
dfs_1(n-1);
}
}
int main()
{
cin>>n;
sp=2*n+1;
for(int i=1;i<=n;i++)
ch[i]='O';
for(int i=n+1;i<=2*n;i++)
ch[i]='*';
for(int i=2*n+1;i<=n*2+2;i++)
ch[i]='_';
dfs_1(n);
cout<<"step="<<s;
return 0;
}