Sicily1798. Alice and Bob[策略问题]
[原題描述]
Description
Bob is very famous because he likes to play games. Today he puts a chessboard in the desktop, and plays a game with Alice. The size of the chessboard is n by n. A stone is placed in a corner square. They play alternatively with Alice having the first move. Each time, player is allowed to move the stone to an unvisited neighbor square horizontally or vertically. The one who can’t make a move will lose the game. If both play perfectly, who will win the game?
Input
The input is a sequence of positive integers each in a separate line. The integers are between 1 and 10000, inclusive, indicating the size of the chessboard. The end of the input is indicated by a zero.
Output
Output the winner (“Alice” or “Bob”) for each input line except the last zero. No other characters should be inserted in the output.
Sample Input
2
0
Sample Output
Alice
解題思路:
這個是一個策略問題,往往這種題目用一般的算法都是很難解決的。但是用數學的方法可能會更好理解一點。
方法:用1*2形狀的骨牌放整個圖
解析:很多人可能會問了,為什么要用上面的骨牌呢?其實理由很簡單。
這是一個雙方博弈的問題。我們先要求Alice的起始點和第一步走的點可以形成一個1*2的骨牌(可以理解為一個矩形)。
上面的假設是合理的。因為移動方法只能是水平的,或者是垂直的。所以,結果是無論在起始點上選擇怎么移動,都可以理解為是在一個已有的1*2的骨牌(矩陣內部移動)。
起始問題解決了
那么按照這樣的思路,對于Bob要做的事情,就是不斷地去從一個骨牌去找到新的骨牌,而,對于Alice就是在Bob已經找好的骨牌內部移動。
有人可能會問了,為什么確保了Bob進入的一定是一個骨牌呢?(就是說,為什么在Bob走完之后,Alice一定能走呢?)
這個問題很對,其實,這時候就需要判斷了(而這個就是這個程序的唯一要考慮的地方)。
因為我們很清楚,一旦確保了Bob每次進入的都是一個新的沒有走過的骨牌,那么Alice的百分百贏的。(Bob負責在找新的骨牌,找到了Alice就去骨牌的另外一個位置就好了嘛)
判斷方法其實很簡單,就是判斷整個圖是否可以被1*2的骨牌完全覆蓋
先看上面的整個圖片,這是一個4*4的正方形(題目說了,圖都是正方形)
我們是能找到這樣的一個圖的用1*2的骨牌覆蓋的方法的。就是如下:
這其實只是其中的一種分類方法。但已經說明了可以用1*2的骨牌進行完全覆蓋。
要知道,Alice是負責在一個Bob已經走過的骨牌中走,保證了Bob不能在這個骨牌中走,讓Bob如果不想輸掉比賽,就必須要去找到新的骨牌。
上面是張”偶數偶數”的圖,下面看一張”奇數奇數”的圖
這個圖是安排不了一個關于1*2的骨牌的全覆蓋的。原因是奇數乘于奇數還是奇數。那么就不能被偶數整除。
像上圖一樣。
那么這時候情況就反過來了。之前我們說Alice只需要在Bob找到的骨牌中移動,確保了Bob不能走回到這個舊的骨牌就好了,那么最后Alice就是穩贏了。但上面的推理,其實在偶數的情況才成立
對于上面的一樣,如果是奇數的呢?
我們就可以理解為,顯示Alice在從起始點走,那么Bob就在Alice走過的那個骨牌內部走這樣的假設合理的,因為在確保了這個圖在減去一個點之后,是可以被一個1*2的骨牌全覆蓋的時候,那么Bob就可以說是在原來的Alice走的骨牌上進行移動了,確保Alice不能在這個舊的骨牌內部走。
最終的代碼:(只需要判斷n是個奇數還是偶數就好了)
#include <iostream> using namespace std; int main(){int n;while (cin >> n && n) {cout << (n%2==0? "Alice\n":"Bob\n");} }最后,老套路,宣傳一波自己的公眾號!(求關注哇!)
本人中大一肥宅,歡迎大家關注,請掃下面的二維碼(〃’▽’〃)
如果覺得有幫助的話,可以掃碼,贊賞鼓勵一下!謝謝!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Sicily1798. Alice and Bob[策略问题]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [SOJ1006] Team Ranki
- 下一篇: [MIPS汇编语言]InsertionS