洛谷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*
思路:
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #define N 1001 using namespace std; int n,st,sp; char a[N]; void print() { for(int i=1;i<=2*n+2;i++) printf("%c",a[i]); printf("\n"); } void move(int m)//挪棋子 { a[sp]=a[m];//空格填上对应位置的棋子 a[sp+1]=a[m+1]; a[m]=a[m+1]='-'; sp=m; print(); } void mv(int m) { if(m==4)//第四种情况的时候要分类讨论 { move(4); move(8); move(2); move(7); move(1); } else//如果还没到第四种情况 { move(m);//move函数里面的数其实是当前要挪动靠前棋子的位置,手续挪动m和m+1两个棋子,一开始要将它们挪到最后,所以sp要初始化为2*n+1,这是第一个空格的位置 move(2*m-1); mv(m-1); } } int main() { cin>>n; for(int i=1;i<=n;i++) a[i]='o'; for(int i=n+1;i<=2*n;i++) a[i]='*'; for(int i=2*n+1;i<=2*n+2;i++) a[i]='-'; st=0; sp=2*n+1; print(); mv(n); return 0; }