洛谷-P1259 黑白棋子的移动

题目描述

有 2n2n 个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为 n=5n=5 的情况:

○○○○○●●●●●

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如 n=5n=5 时,成为:

○●○●○●○●○●

任务:编程打印出移动过程。

输入格式

一个整数 nn。

输出格式

若干行,表示初始状态和每次移动的状态,用"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*

说明/提示

4\leq n\leq 1004≤n≤100

 

分析:

这题不难,找到规律就行,先不看后四行,前面几行的规律很明显

两个空格开始在最后两个地方 ,然后移到了o*中间,此时n=n-1。然后又移到了2*n+1和2*n+2,然后再移到o*中间,n再次-1,然后又回到了2*n+1和2*n+2,这样来回循环,直到前面n==3,即前面剩下三个o为止

后四行,前十位都是固定的,后面加上n-4次的o*,打表就行了

附上AC代码:

#include

using namespace std;
char c[300];
int n;
void print();
void print2();
int main()
{
	cin>>n;
	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]='-';
	int count=n;
	while(count>=4)
	{
		print();
		c[2*count+1]='o';
		c[2*count+2]='*';
		c[count]=c[count+1]='-';
		print();
		count--;
		c[2*count+1]=c[2*count+2]='-';
		c[count+1]=c[count+2]='*';
	}
	print2();


	return 0;
}
void print()
{
	for(int i=1;i<=2*n+2;i++)
	cout<

 

你可能感兴趣的:(洛谷,算法)