藍橋杯 火柴遊戲(經典的博弈演算法)

2021-08-20 04:13:57 字數 1416 閱讀 1943

題目:

這是乙個縱橫火柴棒遊戲。

如圖1,在3x4的格仔中,遊戲的雙方輪流放置火柴棒。

其規則是:

1. 不能放置在已經放置了火柴棒的地方(即只能在空格中放置)。

2. 火柴棒的方向只能是豎直或水平放置。

3. 火柴棒不能與其它格仔中的火柴「連通」。

所謂連通是指兩根火柴棒可以連成一條直線,且中間沒有其它不同方向的火柴「阻攔」。

例如:

圖1所示的局面下,可以在c2位置豎直放置(為了方便描述格仔位置,圖中左、下都新增了標記),但不能水平放置,因為會與a2連通。

同樣道理,b2,b3,d2此時兩種方向都不可以放置。

但如果c2豎直放置後,d2就可以水平放置了,因為不再會與a2連通(受到了c2的阻擋)。

4. 遊戲雙方輪流放置火柴,不可以棄權,也不可以放多根。

如某一方無法繼續放置,則該方為負(輸的一方)。

遊戲開始時可能已經放置了多根火柴。

你的任務是:編寫程式,讀入初始狀態,計算出對自己最有利的放置方法並輸出放置後的局面。

圖1的局面表示為:

00-1

-000

0100

即用「0」表示空閒位置,用「1」表示豎直放置,用「-」表示水平放置。

解法不唯一,找到任意解法即可。

再例如,局面:

1111

----

0010

的解:1111

----

0110

/*

* 思路:試探+遞迴+回溯

*/static boolean fun(char data)

} // 判斷縱向是否存在豎直的連通 如果給我的局面就存在錯誤,那對方上次填寫的時候肯定就輸了,我贏

for (int i = 0; i < data[0].length; i++)

} // 如果給我的局面不能贏,那我再進行試探

for (int i = 0; i < data.length; i++)

data[i][j] = '1';

if (fun(data) == false)

} finally }}

} return false;

} static void solve(char data)

data[i][j] = '1';

if (fun(data) == false)

} finally }}

} }static void showarr(char data)

system.out.println();

} public static void main(string args)

藍橋杯 取球遊戲(博弈)

今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一...

藍橋杯 PREV 46 填字母遊戲(博弈)

prev 46 填字母遊戲 思路 此題博弈的思想就是每個人尋找自己每一步的最優解,我們用dfs模擬博弈過程 int dfs 返回某方此步驟的最優解,遍歷所有空格,模擬所有可能然後取裡面最優的乙個作為函式返回值 在遊戲結束之前每個人每個步驟填乙個空格然後遞迴地將剩下的局面交給對方 為了減少複雜度我們採...

藍橋杯 演算法提高 開燈遊戲

回溯加判斷,注意在改變燈的狀態的時候要用引用,要不然燈的值不會發生改變 然後在每次判斷輸出完之後要清空一下燈的狀態否則會出錯 include include using namespace std int k 10 int d 10 void change int i void judge else...