傳送門
有2n個棋子(n≥4)排成一行,開始為位置白子全部在左邊,黑子全部在右邊,如下圖為n=5的情況:
移動棋子的規則是:每次必須同時移動相鄰的兩個棋子,顏色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子(不能平移),要求最後能移成黑白相間的一行棋子。如n=5時,成為:
任務:程式設計列印出移動過程。
乙個整數n(n<=100)
若干行,表示初始狀態和每次移動的狀態,用"o"表示白子,"*"表示黑子,"-"表示空行。
7
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*
這道題我看了半天題面就是搞不懂題意,沒辦法只好觀察樣例。
乍一看沒啥規律,但是如果你仔細觀察,可能會發現,樣例中的第三行,是這樣的:
oooooo******--o*
可以看到,前面一部分形成了六白六黑兩個空的情形。這不就是\(n = 6\)的情況嗎?
再往下兩行(樣例中的第五行)則是這樣的:
ooooo*****--o*o*
沒錯,前面又形成了\(n = 5\)的情況。
再往下兩行呢?(樣例中的第七行):
oooo****--o*o*o*
前面又形成了\(n = 4\)的情況。
而題目中的資料範圍是\(4 \le n \le 100\),也就是\(n\)最小取4。
那麼我們就差不多明白了,這是一道分治,不斷的分解情況,將\(n = k\)的情況轉化為\(n = k - 1\)的情況,一直到\(n = 4\)。
那麼這是怎麼轉化的呢?還是一樣觀察樣例,我們看看是怎麼從\(n = 7\)的情況轉化為\(n = 6\)的情況的。
ooooooo*******--
|| ||
oooooo--******o*
|| ||
oooooo******--o*
看起來是把前邊的中間的一黑一白移到最後的兩個空位,然後再將原來排列的最後兩顆星星補上前面的空位。(移動的部分已經用||
標出。)
那麼\(n = 6\)到\(n = 5\)呢?
oooooo******--o*
|| ||
ooooo--*****o*o*
|| ||
ooooo*****--o*o*
沒錯,還是這個套路。
轉化的方法我們知道了,那麼接下來再看\(n = 4\)是怎麼處理的吧。
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*
這個看起來沒什麼規律,應該是\(n = 4\)的基本情況了。在**中我們直接按照這種方法,照葫蘆畫瓢式移動就行。
上**啦!
/*
* @author: crab-in-the-northeast
* @date: 2020-04-28 11:24:59
* @last modified by: crab-in-the-northeast
* @last modified time: 2020-04-28 13:32:37
*/#include #include const int maxn = 105;
int n;
char s[maxn * 2 + 5];
int empty_idx;//empty_idx記錄的是兩個空位中的前面那個空位的下標。
void print()
void init()
void move(int x)
//move(x)的效果:將第x個棋與第x + 1個棋一起分別移到兩個空位上
void solve(int k) else
}int main()
ac 100:r33173543 luogu1259 黑白棋子的移動
時空限制 1000ms 128mb 有2n個棋子 n 4 排成一行,開始為位置白子全部在左邊,黑子全部在右邊,如下圖為n 5的情況 移動棋子的規則是 每次必須同時移動相鄰的兩個棋子,顏色不限,可以左移也可以右移到空位上去,但不能調換兩個棋子的左右位置。每次移動必須跳過若干個棋子 不能平移 要求最後能...
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時,...