高僧鬥法
時間限制:1.0s 記憶體限制:256.0mb
問題描述
古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有「高僧鬥法」的趣味節目,以舒緩壓抑的氣氛。
節目大略步驟為:先用糧食(一般是稻公尺)在地上「畫」出若干級台階(表示n級浮屠)。又有若干小和尚隨機地「站」在某個台階上。最高一級台階必須站人,其它任意。(如圖1所示)
兩位參加遊戲的法師分別指揮某個小和尚向上走任意多級的台階,但會被站在高階台階上的小和尚阻擋,不能越過。兩個小和尚也不能站在同一台階,也不能向低階台階移動。
兩法師輪流發出指令,最後所有小和尚必然會都擠在高段台階,再也不能向上移動。輪到哪個法師指揮時無法繼續移動,則遊戲結束,該法師認輸。
對於已知的台階數和小和尚的分布位置,請你計算先發指令的法師該如何決策才能保證勝出。
輸入格式
輸入資料為一行用空格分開的n個整數,表示小和尚的位置。台階序號從1算起,所以最後乙個小和尚的位置即是台階的總數。(n<100, 台階總數<1000)
輸出格式
輸出為一行用空格分開的兩個整數: a b, 表示把a位置的小和尚移動到b位置。若有多個解,輸出a值較小的解,若無解則輸出-1。
樣例輸入
1 5 9
樣例輸出
1 4樣例輸入
1 5 8 10
樣例輸出
1 3思路:博弈論,nim取石子遊戲變形
我們可以將人從前往後兩兩配對,在同一對人中,如果對手移動後乙個人,你總能移動前乙個相同的步數,所以一對人的後乙個人與後面一對人的前乙個人有多少台階是沒有影響的。所以只要考慮同一對人之間有多少台階就行了,這樣就轉化為了nim遊戲。如圖: a與b配對, c與d配對 ,那麼b與c之間的台階是沒有影響的,無論b怎麼移動,a總能夠移動相同的步數。
轉化為nim模型:
將和尚兩兩分為一組(若為奇數,則最後一組的階梯數為0),用陣列儲存兩和尚之間的階梯數,每組階梯數相當於每一堆石子,此時,解法同nim模
型nim取石子遊戲:
異或:相同為0,不同為1,x異或0值為x尼姆博奕(nimm game):
有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。
這種情況最有意思,它與二進位制有密切關係,我們用(a,b,c)表示某種局勢,首
先(0,0,0)顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是
(0,n,n),只要與對手拿走一樣多的物品,最後都將導致(0,0,0)。仔細分析一
下,(1,2,3)也是奇異局勢,無論對手如何拿,接下來都可以變為(0,n,n)的情形。
計算機演算法裡面有一種叫做按位模2加,也叫做異或的運算,我們用符號(+)表示
這種運算。這種運算和一般加法不同的一點是1+1=0。先看(1,2,3)的按位模2加的結
果:1 =二進位制01
2 =二進位制10
3 =二進位制11 (+)
———————
0 =二進位制00 (注意不進製)
對於奇異局勢(0,n,n)也一樣,結果也是0。
任何奇異局勢(a,b,c)都有a(+)b(+)c =0。
如果我們面對的是乙個非奇異局勢(a,b,c),要如何變為奇異局勢呢?假設 a < b
< c,我們只要將 c 變為 a(+)b,即可,因為有如下的運算結果:
a(+)b(+)(a(+)b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要將c 變為a(+)b,只要從 c中減去 c-(a(+)b)即可。
例1。(14,21,39),14(+)21=27,39-27=12,所以從39中拿走12個物體即可達
到奇異局勢(14,21,27)。
例2。(55,81,121),55(+)81=102,121-102=19,所以從121中拿走19個物品
就形成了奇異局勢(55,81,102)。
例3。(29,45,58),29(+)45=48,58-48=10,從58中拿走10個,變為(29,4
5,48)。
例4。我們來實際進行一盤比賽看看:
甲:(7,8,9)->(1,8,9)奇異局勢
乙:(1,8,9)->(1,8,4)
甲:(1,8,4)->(1,5,4)奇異局勢
乙:(1,5,4)->(1,4,4)
甲:(1,4,4)->(0,4,4)奇異局勢
乙:(0,4,4)->(0,4,2)
甲:(0.4,2)->(0,2,2)奇異局勢
乙:(0,2,2)->(0,2,1)
甲:(0,2,1)->(0,1,1)奇異局勢
乙:(0,1,1)->(0,1,0)
甲:(0,1,0)->(0,0,0)奇異局勢
甲勝。
參考:
#include
#include
using namespace std;
int a[
100]
;//存所有和尚的初始位置
int b[
100]
;//存兩兩和尚之間的階梯數
int minmin=
10000
;//移動的最小距離
int mina=0;
//移動的和尚位置
intmain()
for(i=
0;i1;i=i+2)
if(s==0)
//初始局面異或為0,先發指令者必敗
else
if(b[i]
>s)
//左邊的點移動
}else
if(b[i]
//如果右邊有足夠的階梯數可供移動,移動右邊的點}}
}int minb=mina+minmin;
printf
("%d %d"
,mina,minb);}
return0;
}
歷屆試題 高僧鬥法
歷屆試題 高僧鬥法 時間限制 1.0s 記憶體限制 256.0mb 問題描述 古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有 高僧鬥法 的趣味節目,以舒緩壓抑的氣氛。節目大略步驟為 先用糧食 一般是稻公尺 在地上 畫 出若干級台階 表示n級浮屠 又有若干小和尚隨機地 站 在某個台階上。最高一級...
藍橋杯 歷屆試題 高僧鬥法 (尼姆博弈)
時間限制 1.0s 記憶體限制 256.0mb 問題描述 古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有 高僧鬥法 的趣味節目,以舒緩壓抑的氣氛。節目大略步驟為 先用糧食 一般是稻公尺 在地上 畫 出若干級台階 表示n級浮屠 又有若干小和尚隨機地 站 在某個台階上。最高一級台階必須站人,其它任...
藍橋杯 高僧鬥法
古時喪葬活動中經常請高僧做法事。儀式結束後,有時會有 高僧鬥法 的趣味節目,以舒緩壓抑的氣氛。節目大略步驟為 先用糧食 一般是稻公尺 在地上 畫 出若干級台階 表示n級浮屠 又有若干小和尚隨機地 站 在某個台階上。最高一級台階必須站人,其它任意。如圖1所示 兩位參加遊戲的法師分別指揮某個小和尚向上走...