【再帰】洛谷P 1259白黒駒の移動

1540 ワード

タイトルの説明
2 n個の駒(n≧4)が1列に並んでいて、最初は位置白子がすべて左で、黒子がすべて右で、下図がn=5の場合:
○○○○○●●●●●
移動駒のルールは、隣接する2つの駒を同時に移動しなければならないたびに、色に制限はなく、左に移動しても右に移動しても空席に移動することができますが、2つの駒の左右の位置を変えることはできません.移動するたびにいくつかの駒をスキップし(平行移動できない)、最後に白黒の間の1行の駒に移動できることを要求します.n=5の場合、
○●○●○●○●○●
タスク:移動プロセスをプログラミングして印刷します.
にゅうしゅつりょくけいしき
入力フォーマット:整数n(n<=50)
出力フォーマット:初期状態と移動ごとの状態を表すいくつかの行、「o」で白子を表し、「x」で黒子を表し、「空行を表す.
入出力サンプル
入力サンプル#1:7出力サンプル#1:ooooooo***************o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*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);
}