题目描述
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入输出格式
输入格式:
一个整数n(n<=50)
输出格式:
若干行,表示初始状态和每次移动的状态,用”o”表示白子,”x”表示黑子,”-“表示空行。
输入输出样例
输入样例#1:
7
输出样例#1:
ooooooo*******–
oooooo–*****o
oooooo******–o*
ooooo–****o*o
ooooo*****–o*o*
oooo–***o*o*o
oooo****–o*o*o*
ooo–**o*o*o*o
ooo*o**–o*o*o
o–o**oo*o*o*o
o*o*o*–o*o*o*o*
–o*o*o*o*o*o*o*
代码
#include<iostream>
using namespace std;
char a[10000];
int n,sp;
void print()
{
for(int i=1;i<=2*n+2;i++)cout<<a[i];
cout<<endl;
}
void move(int k)
{
for(int j=0;j<=1;j++)
{
a[sp+j]=a[k+j];
a[k+j]='-';
}
sp=k;
print();
}
void choose(int x)
{
if(x==4)
{
move(4);move(8);move(2);move(7);move(1);
}
else
{
move(x);move(2*x-1);choose(x-1);
}
}
int main()
{
cin>>n;
sp=2*n+1;
for(int i=1;i<=n;i++)a[i]='o';
for(int i=n+1;i<=2*n;i++)a[i]='*';
a[2*n+1]='-';
a[2*n+2]='-';
print();
choose(n);
}
这篇博客介绍了如何使用递归解决洛谷P1259题目的方法,该题目要求将黑白相间的棋子通过特定规则移动到最终状态。博主提供了输入输出格式说明及样例,并展示了实现移动过程的代码。
476

被折叠的 条评论
为什么被折叠?



