高僧鬥法 博弈論

2021-07-11 23:44:38 字數 1393 閱讀 9040

問題描述

古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有「高僧鬥法」的趣味節目,以舒緩壓抑的氣氛。

節目大略步驟為:先用糧食(一般是稻公尺)在地上「畫」出若干級台階(表示n級浮屠)。又有若干小和尚隨機地「站」在某個台階上。最高一級台階必須站人,其它任意。(如圖1所示)

兩位參加遊戲的法師分別指揮某個小和尚向上走任意多級的台階,但會被站在高階台階上的小和尚阻擋,不能越過。兩個小和尚也不能站在同一台階,也不能向低階台階移動。

兩法師輪流發出指令,最後所有小和尚必然會都擠在高段台階,再也不能向上移動。輪到哪個法師指揮時無法繼續移動,則遊戲結束,該法師認輸。

對於已知的台階數和小和尚的分布位置,請你計算先發指令的法師該如何決策才能保證勝出。

輸入格式

輸入資料為一行用空格分開的n個整數,表示小和尚的位置。台階序號從1算起,所以最後乙個小和尚的位置即是台階的總數。(n<100, 台階總數<1000)

輸出格式

輸出為一行用空格分開的兩個整數: a b, 表示把a位置的小和尚移動到b位置。若有多個解,輸出a值較小的解,若無解則輸出-1。

樣例輸入

1 5 9

樣例輸出

1 4

樣例輸入

1 5 8 10

樣例輸出

1 3解釋

將所有人配對,比如共有6個小和尚,則將1、2配對,3、4配對,5、6配對,一對小和尚之間的台階可看作一堆石子,共有3堆石子,問題就轉換為nim遊戲,即:

3堆石子,兩人輪流取,每次取某堆中不少於1個,最後取完者勝。

必勝局面:所有物品數目二進位制異或!= 0

必輸局面:所有物品數目二進位制異或 == 0

當移動小和尚的方式為只移動一對小和尚中的第乙個時,為nim遊戲,如果移動後乙個,則破壞了nim遊戲,為了恢復nim遊戲,我們需移動前一對中的後乙個。

#include "iostream"

#include "stdio.h"

using

namespace

std;

int main()

int n = i;

int b[101];

for(i=0; i1; i++)

b[i] = a[i+1] - a[i] - 1;

b[n-1] = 0;

int r = 0;

for(i=0; i1; i+=2)

r ^= b[i];

if(r == 0)

cout

<< -1;

else

b[i] += j;

if(i > 0)

b[i-1] -= j;}}

return

0;}

高僧鬥法 博弈論

問題描述 古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有 高僧鬥法 的趣味節目,以舒緩壓抑的氣氛。節目大略步驟為 先用糧食 一般是稻公尺 在地上 畫 出若干級台階 表示n級浮屠 又有若干小和尚隨機地 站 在某個台階上。最高一級台階必須站人,其它任意。如圖1所示 兩位參加遊戲的法師分別指揮某個小...

歷屆試題 高僧鬥法(博弈)

古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有 高僧鬥法 的趣味節目,以舒緩壓抑的氣氛。節目大略步驟為 先用糧食 一般是稻公尺 在地上 畫 出若干級台階 表示n級浮屠 又有若干小和尚隨機地 站 在某個台階上。最高一級台階必須站人,其它任意。如圖1所示 兩位參加遊戲的法師分別指揮某個小和尚向上走...

歷屆試題 高僧鬥法 階梯博弈

思路 遊戲結束狀態是所有和尚都無法移動,這是p態,把相鄰的兩個和尚看作乙個狀態,例如1 5 8 10,可以看作 1,5 和 8,10 兩個和尚中間的樓梯數作為sg值。假設當前是n態 sg異或值大於0 可以一步讓異或值變為0即p態,而且p態只能變成n態,即符合nimm博弈的性質,直接就能判斷是否能獲勝...