2621 - 黑白棋子的移动

通过次数

0

提交次数

0

时间限制 : 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;
}