您的位置:首页 > 其它

60.(递推练习)黑白棋子

2016-03-11 18:38 225 查看


2230 黑白棋子[/b]

时间限制: 1
s

空间限制:
32000 KB

题目等级 :
大师 Master

题解

查看运行结果

题目描述 Description



有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:

○○○○○●●●●●

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:

○●○●○●○●○●

任务:编程打印出移动过程。



输入描述 Input
Description

n

输出描述 Output
Description

编程打印出移动过程。

样例输入 Sample
Input

7

样例输出 Sample
Output

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*

数据范围及提示 Data Size &
Hint

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的格式是对齐两位输出

for(int j=1;j<=n-i+1;++j)

printf("o");

for(int j=1;j<=n-i+1;++j)

printf("*");

printf("--");

for(int j=1;j<=i-1;++j)

printf("o*");

printf("\n");

}

step++;

if(step%2==1)

{

cout<<"step"<<setw(2)<<step<<":";

for(int j=1;j<=n-i;j++)

printf("o");

printf("--");

for(int j=1;j<=n-i;j++)

printf("*");

for(int j=1;j<=i;++j)

printf("o*");

printf("\n");

}

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: