演算法學習之路|棋盤問題(博弈)
小明和小紅在玩一種棋盤遊戲,棋盤的尺寸為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
- 棋盤覆蓋問題
- poj 1321 棋盤問題 回溯 JavaJava
- POJ1321棋盤問題(DFS)
- 馬踏棋盤演算法(騎士周遊問題)----遞迴與貪心優化演算法演算法遞迴優化
- 演算法學習回顧-皇后問題演算法
- 【演算法學習筆記】博弈論淺析之遊戲類演算法筆記遊戲
- 【演算法學習筆記】生成樹問題探究演算法筆記
- 強化學習之路一 QLearning 演算法強化學習演算法
- 怎樣解題|題3.2.14:填充國際象棋棋盤
- 棋盤 K皇后
- 棋盤覆蓋
- I. 棋盤
- Java學習筆記(七):五子棋AI演算法Java筆記AI演算法
- react 學習 問題React
- 小白機器學習基礎演算法學習必經之路(下)機器學習演算法
- 手擼機器學習演算法 - 非線性問題機器學習演算法
- 怎樣解題|題3.3.28:國際象棋棋盤上的車
- 學習方向的問題
- Spark學習——問題排查Spark
- 面經問題學習
- 【演算法工程師】機器學習面試問題總結演算法工程師機器學習面試
- 用定租問題學透機器學習的K近鄰演算法機器學習演算法
- eggjs學習之路JS
- java學習之路Java
- Pytest學習之路
- 【完虐演算法】LeetCode 接雨水問題,全覆盤演算法LeetCode
- 前端學習之路:解決vue引入assets下圖片路徑找不到問題前端Vue
- 機器學習&深度學習之路機器學習深度學習
- mysql學習整理所有問題MySql
- 學習redis問題記錄Redis
- 電子棋盤(二)——戰棋地形的多樣性
- 【學習】分享幾個學習中的小問題
- 博弈補充練習
- 付費學習之路
- 產品學習之路
- vue-學習之路Vue