2621 - 黑白棋子的移动
时间限制 : 1 秒
内存限制 : 128 MB
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:○○○○○●●●●●移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:○●○●○●○●○●任务:编程打印出移动过程。
题目输入
题目输出
输入/输出样例
输入格式
7
输出格式
step 0:ooooooo*******-- step 1:oooooo--******o* step 2:oooooo******--o* step 3:ooooo--*****o*o* step 4:ooooo*****--o*o* step 5:oooo--****o*o*o* step 6:oooo****--o*o*o* step 7:ooo--***o*o*o*o* step 8:ooo*o**--*o*o*o* step 9:o--*o**oo*o*o*o* step 10:o*o*o*--o*o*o*o* step 11:--o*o*o*o*o*o*o*
C++解答
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<string> #include<queue> #define maxx 1000000 using namespace std; long long int n,t,p; char c[maxx]; void print() { cout<<"step "<<t<<":"; for(int i=1;i<=2*n+2;++i) cout<<c[i]; cout<<endl; t++; } void scan(int n) { t=0; p=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 work(int k) { for(int j=0;j<=1;++j) { c[p+j]=c[k+j]; c[k+j]='-'; } p=k; print(); } void mm(int n) { if(n==4) { work(4); work(8); work(2); work(7); work(1); } else { work(n); work(2*n-1); mm(n-1); } } int main() { ios::sync_with_stdio(false); cin>>n; scan(n); mm(n); return 0; }