题干
题目链接:https://www.luogu.com.cn/problem/P1259
题目描述
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入格式
一个整数n(n<=100)
输出格式
若干行,表示初始状态和每次移动的状态,用"o"表示白子,"*"表示黑子,"-"表示空行。
输入输出样例
输入 #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*
思路
分析样例
将样例每两行分开一次:
ooooooo*******--
oooooo--******o*
oooooo******--o*
ooooo--*****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*
//在最后的4行结尾都是"o*o*o*"
//"oo"与"--"交换
//"--"与"*o"交换
//"o*"与"--"交换
//写代码时需要特判
代码实现
#include<iostream>
using namespace std;
char a[10000];
int n,sp;
void mv(int k)
{
for(int j=0;j<=1;j++)
{
a[sp+j]=a[k+j];
a[k+j]=‘-‘;
}
sp=k;
for(int i=1;i<=2*n+2;i++)
cout<<a[i];
cout<<endl;
}
void check(int x)
{
if(x==4){//等于4时进行特判
mv(4);mv(8);mv(2);mv(7);mv(1);
}
else{
mv(x);mv(2*x-1);check(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]=‘-‘;
for(int i=1;i<=2*n+2;i++)
cout<<a[i];
cout<<endl;//先对于初始状态进行输出
check(n);
}