luogu p1259 黑白棋子的移動

2022-02-15 11:48:50 字數 2419 閱讀 4172

傳送門

有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時,...