演算法學習之路|棋盤問題(博弈)
小明和小紅在玩一種棋盤遊戲,棋盤的尺寸為n個方格*m個方格。一開始在棋盤的右上角(1,m)放一枚硬幣,每次一個人可以將硬幣向左、下或左下的方格移動。
當某個人無法再移動硬幣了,那麼這個人就輸了。遊戲總是小明先開始,如果他們兩個每步都是最優策略,則誰將贏得遊戲?
輸入格式
輸入包含多組測試資料。每組輸入兩個整數n和m(0當n=m=0時,輸入結束。
輸出格式
對於每組輸入,如果小明贏,輸出“Wonderful!”,否則輸出“What a pity!”。
樣例輸入
5 3
5 4
6 6
0 0
樣例輸出
What a pity!
Wonderful!
Wonderful!
解題思路
簡單博弈論題,誰走最後一步到達角落,誰就獲勝(後一個人無路可走)。
來考慮最後的情況,如果棋子距離左邊下邊都只剩兩格,那麼下一個動的人一定輸。
討論兩種情況:
- 向左或向下走,後一個走的人一定也走向左或向下的路線,這樣能使棋子到達一個邊界且距另一條邊界2格,那麼之後的兩步必然兩個人都各走一步。後走的人搶先到達角落到達角落,先走的那個人就無法移動了(輸)。(例:(2,2)-(2,1)-(2,0)-(1,0)-(0,0)(輸))
- 向左下走,那麼後走的人也一定向左下走,這樣就搶先到達(0,0),獲勝,先走的人輸。
再考慮一般情況:棋子距兩邊界格數均為偶數。
可以把上面情況一般化,後走的人一定跟隨先走的人的方向移動,使得兩人各移動一步後棋子距兩邊界格數保持偶數(包含0),同理,先走必輸。
由此,即可得出結論。
#include<stdio.h>
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
int a=n-1,b=m-1;
if(a%2==0&&b%2==0)
printf("What a pity!
");
else printf("Wonderful!
");
}
return 0;
}
相關文章
- 演算法學習之路|日期問題演算法
- 分治演算法-求解棋盤覆蓋問題演算法
- 演算法學習之路|舊鍵盤打字演算法
- poj 1321 棋盤問題 回溯 JavaJava
- 演算法學習之路|選擇題演算法
- 馬踏棋盤演算法(騎士周遊問題)----遞迴與貪心優化演算法演算法遞迴優化
- 演算法學習之路|划拳演算法
- 博弈學習 (二) 斐波那契博弈
- 演算法學習之路|A除以B演算法
- 演算法學習之路|列印排名演算法
- 演算法學習之路|方格分割演算法
- 演算法學習之路|朋友數演算法
- 演算法學習之路|SpellItRight演算法
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- 演算法學習之路|月餅演算法
- 演算法學習之路|PATRanking演算法
- 演算法學習之路|列印沙漏演算法
- 演算法學習之路|快速排序演算法排序
- 演算法學習之路|結繩演算法
- 演算法學習之路|數零壹演算法
- 演算法學習之路|開學寄語演算法
- 演算法學習回顧-皇后問題演算法
- 演算法學習-荷蘭國旗問題演算法
- 演算法學習之路|說反話演算法
- 演算法學習之路|幼兒園買玩具演算法
- 演算法學習之路|小賭怡情演算法
- 演算法學習之路|影像過濾演算法
- 演算法學習之路|賣個萌演算法
- 演算法學習之路|螺旋矩陣演算法矩陣
- 演算法學習之路|字元統計演算法字元
- 【演算法學習筆記】博弈論淺析之遊戲類演算法筆記遊戲
- 演算法學習之路|科學計數法演算法
- 馬踏棋盤之貪心演算法優化演算法優化
- 圖的遍歷演算法-馬遍歷棋盤演算法
- 題目4:棋盤尋寶擴充套件套件
- 演算法學習之路|PlayOnWords(尤拉道路+dfs)演算法
- 演算法學習之路|最簡分數演算法
- 演算法學習之路|檢驗身份證演算法