高僧斗法--Staircase Nim
生活随笔
收集整理的這篇文章主要介紹了
高僧斗法--Staircase Nim
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
古時喪葬活動中經常請高僧做法事。儀式結束后,有時會有“高僧斗法”的趣味節目,以舒緩壓抑的氣氛。
? ? 節目大略步驟為:先用糧食(一般是稻米)在地上“畫”出若干級臺階(表示N級浮屠)。又有若干小和尚隨機地“站”在某個臺階上。最高一級臺階必須站人,其它任意。(如圖1所示)
? ? 兩位參加游戲的法師分別指揮某個小和尚向上走任意多級的臺階,但會被站在高級臺階上的小和尚阻擋,不能越過。兩個小和尚也不能站在同一臺階,也不能向低級臺階移動。
? ? 兩法師輪流發出指令,最后所有小和尚必然會都擠在高段臺階,再也不能向上移動。輪到哪個法師指揮時無法繼續移動,則游戲結束,該法師認輸。
? ? 對于已知的臺階數和小和尚的分布位置,請你計算先發指令的法師該如何決策才能保證勝出。
? ? 輸入數據為一行用空格分開的N個整數,表示小和尚的位置。臺階序號從1算起,所以最后一個小和尚的位置即是臺階的總數。(N<100, 臺階總數<1000)
? ? ? ? ??
? ? 輸出為一行用空格分開的兩個整數: A B, 表示把A位置的小和尚移動到B位置。若有多個解,輸出A值較小的解,若無解則輸出-1。
例如:
用戶輸入:
1 5 9
則程序輸出:
1 4
再如:
用戶輸入:
1 5 8 10
則程序輸出:
? ? 節目大略步驟為:先用糧食(一般是稻米)在地上“畫”出若干級臺階(表示N級浮屠)。又有若干小和尚隨機地“站”在某個臺階上。最高一級臺階必須站人,其它任意。(如圖1所示)
? ? 兩位參加游戲的法師分別指揮某個小和尚向上走任意多級的臺階,但會被站在高級臺階上的小和尚阻擋,不能越過。兩個小和尚也不能站在同一臺階,也不能向低級臺階移動。
? ? 兩法師輪流發出指令,最后所有小和尚必然會都擠在高段臺階,再也不能向上移動。輪到哪個法師指揮時無法繼續移動,則游戲結束,該法師認輸。
? ? 對于已知的臺階數和小和尚的分布位置,請你計算先發指令的法師該如何決策才能保證勝出。
? ? 輸入數據為一行用空格分開的N個整數,表示小和尚的位置。臺階序號從1算起,所以最后一個小和尚的位置即是臺階的總數。(N<100, 臺階總數<1000)
? ? ? ? ??
? ? 輸出為一行用空格分開的兩個整數: A B, 表示把A位置的小和尚移動到B位置。若有多個解,輸出A值較小的解,若無解則輸出-1。
例如:
用戶輸入:
1 5 9
則程序輸出:
1 4
再如:
用戶輸入:
1 5 8 10
則程序輸出:
1 3
-----------------------------------------------
分析:這是staircase Nim博弈的一個變形:
? ? 2.但是它比staircase Nim 多了一步,就是要求出第一步如何移動。原先的思路是用異或的相同消去特性,但是并不可行,于是用暴力枚舉了每一步移動,并算出移動后是否為P-position局面。
? ? 3.在枚舉移動每一步方面,原以為只需枚舉奇數臺階的減少情況,但是無法通過藍橋杯最后一個評測數據。通過觀察其數據,發現還需枚舉偶數臺階的減少情況,因為這會導致奇數臺階的增加。
------------------------------------------
#include<iostream> #include<cstdio> using namespace std; int main(){int n;int op;int array[105] = {0};int i = 0;while(scanf("%d%c",&n,&op)){array[i++] = n; if(op == '\n')break;}int stair[105] = {0};for(int j = 1; j < i; j++){stair[j] = array[j] - array[j-1] - 1;//記錄臺階情況,從第一級開始 }int sum = 0;for(int j = 1; j < i; j += 2){sum = sum^stair[j];}int k = 1;if(sum == 0) cout<<-1<<endl;//P-positionelse{//移動第一步后,設法變為P-position while(1){sum = 0;for(int j = 1 ; j < i; j+=2){sum = sum^stair[j];}if(sum != 0){stair[k]--;if(k%2 == 0) {//如果是偶數級臺階,它的遞減引起它的上一級的臺階的遞增 stair[k-1]++;}if(stair[k] == -1){//當前臺階枚舉完成 k++;stair[k-1] = array[k-1] - array[k-2] - 1;//當前臺階還原 stair[k-2] = array[k-2] - array[k-3] - 1;//偶數級臺階引起的變化,要還原 }}else{cout<<array[k-1];cout<<" ";cout<<array[k]-stair[k]-1<<endl;return 0;} } }return 0; }
總結
以上是生活随笔為你收集整理的高僧斗法--Staircase Nim的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: List去除重复数据的几种方式和性能比较
- 下一篇: python中天天向上的力量实例