【递归】洛谷 P1259 黑白棋子的移动

题目描述

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

○○○○○●●●●●

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

○●○●○●○●○●

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

输入输出格式

输入格式:
一个整数n(n<=50)

输出格式:
若干行,表示初始状态和每次移动的状态,用”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
using namespace std;
char a[10000];
int n,sp;
void print()
{
    for(int i=1;i<=2*n+2;i++)cout<move(int k)
{
    for(int j=0;j<=1;j++)
    {
        a[sp+j]=a[k+j];
        a[k+j]='-';
    }
    sp=k;
    print();
}
void choose(int x)
{
    if(x==4)
    {
        move(4);move(8);move(2);move(7);move(1);
    }
    else
    {
        move(x);move(2*x-1);choose(x-1);
    }
}
int main()
{
    cin>>n;
    sp=2*n+1;
    for(int i=1;i<=n;i++)a[i]='o';
    for(int i=n+1;i<=2*n;i++)a[i]='*';
    a[2*n+1]='-';
    a[2*n+2]='-';
    print();
    choose(n);
}

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