有2n個棋子(n≥4)排成一行,開始為位置白子全部在左邊,黑子全部在右邊,如下圖為n=5的情況:
移動棋子的規則是:每次必須同時移動相鄰的兩個棋子,顏色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子(不能平移),要求最後能移成黑白相間的一行棋子。如n=5時,成為:
任務:程式設計列印出移動過程。
乙個整數n(n<=100)
若干行,表示初始狀態和每次移動的狀態,用"o"表示白子,"*"表示黑子,"-"表示空行。
輸入
7輸出
ooooooo*******--先仔細觀察,我們可以發現,從初始字串「ooooooo*******--」開始,處理兩步後得到「oooooo******--o*」,該字串實際是n=6的乙個子問題,而對於每乙個子問題n,其移動步驟是: //先將n,n+1移動到2n+1,2n+2的空位,再將2n-1,2n移動到n,n+1的空位。因此我們可以使用遞迴,不斷將我們的問題化小,但是注意的是,當n==4其轉移步驟有所不同,因此這裡當n縮小為4時,我們需要單獨處理(也可以說是遞迴的邊界)。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#include#includeusing namespace std;
int str[220]; //3表示"o",2表示"*",1表示"-"
int n;
void print(int strat) //列印從start開始到末尾的字串
printf("\n");
}void fun(int n) //n表示縮小為規模n的子問題
else //先將n,n+1移動到2n+1,2n+2的空位,再將2n-1,2n移動到n,n+1的空位 }
int main()
P1259 黑白棋子的移動
我們先分析一下樣例 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 每兩行分一組的...
P1259 黑白棋子的移動
有2n個棋子 n 4 排成一行,開始為位置白子全部在左邊,黑子全部在右邊,如下圖為n 5的情況 移動棋子的規則是 每次必須同時移動相鄰的兩個棋子,顏色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子 不能平移 要求最後能移成黑白相間的一行棋子。如n 5時,...
洛谷 P1259 黑白棋子的移動
題目鏈結 遞迴 分治 打表 這題.一上來讓我有點兒蒙啊.但其實就在於找規律,舉幾個例子自己動手寫一下就恍然大悟了。比如這樣 當然,題目條件是4 n 100 只需要先將中間緊挨的黑白棋子和空格交換,再將最後兩個黑色棋子與空格交換就好啦!之後就很歡快地去敲鍵盤了!結果全部wa掉。然後才知道我畫的每個例子...