天天看點

黑白棋子的移動

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;
}

           

繼續閱讀