Problem Description
有2n個棋子(20≥n≥4)排成一行,開始位置為白子全部在左邊,黑子全部在右邊,如下圖為n=5的情形:○○○○○●●●●●
移動棋子的規則是:每次必須同時移動相鄰的兩個棋子,顔色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過 若幹個棋子(不能平移),要求最後能移成黑白相間的一行棋子。如n=5時,成為:○●○●○●○●○●
Input
輸入有多組資料,每組資料隻有一行為n。
Output
對于每組資料輸出移動過程。
Sample Input
7
Sample Output
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*
step10:o*o*o*--o*o*o*o*
/*
思路:
數組a[]用來作為棋子移動的場所,初始時,a[0]~a[n-1]存放白子(用字元o表示),a[n]~a[2*n-1]存放黑子(用字元*表示),
a[2*n],a[2*n+1]為空位置(用字元—表示).
*/
#include<cstdio>
#include<iostream>
using namespace std;
int n, mj;
int mi;
char a[101];
void move(int i) //移動
{
a[mj] = a[i];
a[mj + 1] = a[i + 1];
a[i] = '-';
a[i + 1] = '-';
mj = i;
printf("step%2d:", mi++);
for(i = 0; i < 2 * n + 2; i++)
printf("%c", a[i]);
printf("\n");
}
void fun(int n)
{
if (n == 4) //n等于4的情況要特殊處理(左移動二,右移動一)
{
move(3);move(7);
move(1);move(6);
move(0);
}
else //(左移動一,右移動二)
{
move(n - 1);
move(2 * n - 2);
fun(n - 1);
}
}
int main()
{
int i, j;
while(scanf("%d", &n) != EOF)
{
mi = 1;
mj = 2 * n;
for(i = 0; i < n; i++)
a[i] = 'o';
for(i = n; i < 2 * n; i++)
a[i] = '*';
a[2 * n] = '-';
a[2 * n + 1] = '-';
printf("step%2d:", 0);
for(i = 0; i < 2 * n + 2; i++)
printf("%c", a[i]);
printf("\n");
fun(n);
}
return 0;
}