60.(递推练习)黑白棋子
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
n
编程打印出移动过程。
7
step 0:ooooooo*******--
step 1:oooooo--******o*
step 2:oooooo******--o*
step 3:ooooo--*****o*o*
step 4:ooooo*****--o*o*
step 5:oooo--****o*o*o*
step 6:oooo****--o*o*o*
step 7:ooo--***o*o*o*o*
step 8:ooo*o**--*o*o*o*
step 9:o--*o**oo*o*o*o*
step 10:o*o*o*--o*o*o*o*
step 11:--o*o*o*o*o*o*o*
n<20
代码:
#include
using namespace std;
#include
#include
char
a[4][20]={"ooo*o**--*","o--*o**oo*","o*o*o*--o*","--o*o*o*o*"};
//最后四步是没有规律的,单独存下来,直接输出
int n,step=0;
int main()
{
cin>>n;
int i=1;
while(i<=n-3)
{
if(step%2==0)
{
cout<<"step"<<setw(2)<<step<<":";//注意开始的step的格式是对齐两位输出
i++;
step++;
}
cout<<"step"<<setw(2)<<step<<":";//最后四步是没有规律的,单独存下来,直接输出
printf("%s",a[0]);
for(int j=1;j<=n-4;++j)
printf("o*");
printf("\n");
step++;
cout<<"step"<<setw(2)<<step<<":";
printf("%s",a[1]);
for(int j=1;j<=n-4;++j)
printf("o*");
printf("\n");
step++;
cout<<"step"<<setw(2)<<step<<":";
printf("%s",a[2]);
for(int j=1;j<=n-4;++j)
printf("o*");
printf("\n");
step++;
cout<<"step"<<setw(2)<<step<<":";
printf("%s",a[3]);
for(int j=1;j<=n-4;++j)
printf("o*");
printf("\n");
step++;
return 0;
}