DFS 藍橋杯試題 填字母遊戲

2021-10-03 09:38:36 字數 2155 閱讀 6068

oj位址

小明經常玩 lol 遊戲上癮,一次他想挑戰k大師,不料k大師說:

「我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩lol了」。

k大師在紙上畫了一行n個格仔,要小明和他交替往其中填入字母。

並且:1. 輪到某人填的時候,只能在某個空格中填入l或o

2. 誰先讓字母組成了「lol」的字樣,誰獲勝。

3. 如果所有格仔都填滿了,仍無法組成lol,則平局。

小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。

第一行,數字n(n<10),表示下面有n個初始局面。

接下來,n行,每行乙個串,表示開始的局面。

比如:「**」, 表示有6個空格。「l」, 表示左邊是乙個字母l,它的右邊是4個空格。

要求輸出n個數字,表示對每個局面,如果小明先填,當k大師總是用最強著法的時候,小明的最好結果。

1 表示能贏

-1 表示必輸

0 表示可以逼平

4

***l**l

l**l***l

l*****l

0-11

1

簡單的博弈類問題,寫出來不難,但是好像藍橋杯對執行時間卡的挺嚴的。看一下最後ac的結果

一開始也用了記憶化搜尋了,但是只給了60分,剩下兩個測試點都是超時,後來看見乙個人寫的**,仔細比對,邏輯上沒有問題,但是我的就是超時,一點點修改,發現了問題,一開始我的程式如下:

#include

using

namespace std;

mapint> vis;

string sc;

intgame

(string sc)

if(sc.

find

("lol")!=

-1)if

(sc.

find

("*")==

-1)bool ping =

false

;for

(unsigned

int i =

0; i < sc.

size()

;i++

)else

if(f ==0)

tmp[i]

='o'

; f =

game

(tmp);if

(f ==-1

)else

if(f ==0)

}}if(ping)

return vis[sc]=-

1;}int

main()

return0;

}

和人家的進行比對,發現相差的一點就是,我的dfs函式的引數string sc這個字串,他放在了全域性變數的位置,我試了一下,果真!在全域性變數中就ac了,最後的ac**在下邊。貌似全域性變數的操作比引數效率要高?

#include

using

namespace std;

mapint> vis;

string sc;

intgame()

if(sc.

find

("lol")!=

-1)if

(sc.

find

("*")==

-1)bool ping =

false

;for

(unsigned

int i =

0; i < sc.

size()

;i++

)else

if(f ==0)

sc[i]

='o'

; f =

game()

; sc[i]

='*';if

(f ==-1

)else

if(f ==0)

}}if(ping)

return vis[sc]=-

1;}int

main()

return0;

}

藍橋杯 歷屆試題 填字母遊戲

傳送門 問題描述 小明經常玩 lol 遊戲上癮,一次他想挑戰k大師,不料k大師說 我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩lol了 k大師在紙上畫了一行n個格仔,要小明和他交替往其中填入字母。並且 1.輪到某人填的時候,只能在某個空格中填入l或o 2.誰先讓字母組成了 lol 的字樣,...

藍橋杯 填字母

題目 輪到某人填的時候,只能在某個空格中填入l或o 誰先讓字母組成了 lol 的字樣,誰獲勝。如果所有格仔都填滿了,仍無法組成lol,則平局。小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。本題的輸入格式為 第一行,數字n n 10 表示下面有n個初始局面。接下來,n行,每行乙個串,...

藍橋杯 歷屆試題 填字母遊戲 記憶化搜尋

小明經常玩 lol 遊戲上癮,一次他想挑戰k大師,不料k大師說 我們先來玩個空格填字母的遊戲,要是你不能贏我,就再別玩lol了 k大師在紙上畫了一行n個格仔,要小明和他交替往其中填入字母。並且 1.1.1.輪到某人填的時候,只能在某個空格中填入l或o 2.2.2.誰先讓字母組成了 lol 的字樣,誰...