luogu1259 黑白棋子的移动
时空限制 1000ms/128MB
题目描述
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入输出格式
输入格式:一个整数n(n<=100)
输出格式:若干行,表示初始状态和每次移动的状态,用"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;
int n,pos;
char c[205];
void print(){
for (int i=1; i<=2*n+2; i++) cout<<c[i];
cout<<endl;
}
void init(int n){
pos=2*n+1; //空位的开始下标
for (int i=1; i<=n; i++) c[i]='o'; //白子
for (int i=n+1; i<=2*n; i++) c[i]='*'; //黑子
c[2*n+1]=c[2*n+2]='-'; //空位
print();
}
void move(int k){
for (int j=0; j<=1; j++){
c[pos+j]=c[k+j];
c[k+j]='-';
}
pos=k; //更新空位
print();
}
void mv(int n){
if (n==4){ move(4); move(8); move(2); move(7); move(1); }
else { move(n); move(2*n-1); mv(n-1); }
}
int main(){
cin>>n;
init(n);
mv(n);
return 0;
}