【遞歸】洛谷 P1259 黑白棋子的移動

題目描述

有2n個棋子(n≥4)排成一行,開始爲位置白子所有在左邊,黑子所有在右邊,以下圖爲n=5的狀況:ios

○○○○○●●●●●web

移動棋子的規則是:每次必須同時移動相鄰的兩個棋子,顏色不限,能夠左移也能夠右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子(不能平移),要求最後能移成黑白相間的一行棋子。如n=5時,成爲:編程

○●○●○●○●○●svg

任務:編程打印出移動過程。spa

輸入輸出格式

輸入格式:
一個整數n(n<=50)code

輸出格式:
若干行,表示初始狀態和每次移動的狀態,用」o」表示白子,」x」表示黑子,」-「表示空行。xml

輸入輸出樣例

輸入樣例#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*ci

代碼

#include<iostream>
using namespace std;
char a[10000];
int n,sp;
void print()
{
    for(int i=1;i<=2*n+2;i++)cout<<a[i];
    cout<<endl;
}
void 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);
}