有 2n 个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边。(4<=n<=100)
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。
例如当n=5时:
ooooo*****--
=>--o*o*o*o*o*
(o为白棋 *为黑棋 -为空格)
方法:采用分治的方法
当n=4时的步骤与n=5,n=6...的一些步骤时相同的,
所以可以把n的问题拆解成n-1的问题
我们用一个数组chess作为“棋子移动的地方” 并且按照题目要求初始
函数Initial用来初始
函数Reflect_用来输出
函数doo用来按题意执行 并且移动棋子
#include<iostream>
using namespace std;
int n,s;
char chess[101];
void Reflect_()
{
for(int i=1;i<=2*n+2;i++){
cout<<chess[i];
}
cout<<endl;
}
void Initial(int n)
{
s=2*n+1;
for(int i=1;i<=n;i++){
chess[i]='o';
}
for(int i=n+1;i<=2*n;i++){
chess[i]='*';
}
for(int i=2*n+1;i<=2*n+2;i++){
chess[i]='-';
}
Reflect_();
}
void Fdoo(int k)
{
for(int i=0;i<=1;i++){
chess[s+i]=chess[k+i];
chess[k+i]='-';
}
s=k;
Reflect_();
}
void Sdoo(int n)
{
int k;
if(n==4){
Fdoo(4);Fdoo(8);Fdoo(2);Fdoo(7);Fdoo(1);
}
else{
Fdoo(n);Fdoo(2*n-1);Sdoo(n-1);
}
}
int main()
{
cin>>n;
Initial(n);
Sdoo(n);
}