用博弈论的思想玩游戏(洛谷P3150题题解,Java语言描述)
前言
博弈論,博大精深啊~~
這里就是一個(gè)簡(jiǎn)單博弈論的算法題,典型的入門(mén)級(jí)別,值得學(xué)習(xí)。
題目要求
P3150題目鏈接
分析
我們模擬一下勝負(fù)情況:
m=1時(shí):
pb不能分割,所以zs贏了。
m=2時(shí):
pb分割成1+1,對(duì)方拿走一份,必定是1。對(duì)于剩下的1,zs不能分割,pb贏了。
m=3時(shí):
pb分割成2+1,對(duì)方為了續(xù)命,只能剩下2,zs對(duì)2進(jìn)行1+1的分割,此時(shí)情況回到逆向的m=2,所以zs贏了。
m=4時(shí):
pb有兩種選擇,3+1或者2+2。
3+1時(shí),zs為了續(xù)命,只能剩下3,這是反向的m=3,pb贏了。
2+2時(shí),zs只能剩下2,這是反向的m=2,zs就贏了。
但是pb先手,而且用最優(yōu)策略,自然會(huì)選擇3+1方案,就贏了。
m=5時(shí):
pb有兩種選擇,3+2或者4+1。
3+2時(shí),zs選3就會(huì)輸,選2就會(huì)贏。
4+1時(shí),zs選1就輸了,只能選4,然后他會(huì)為了勝利進(jìn)行3+1方案,堵死pb獲勝的可能。
所以pb不論作何選擇,zs都有將其100%堵死的策略,zs必勝。
m=6時(shí):
pb有三種可能,3+3或者4+2或者5+1。
3+3時(shí),zs只能選3,就是逆向的m=3,pb贏。
4+2時(shí),zs選2就肯定贏,選4的話就能選3+1方案,封死pb獲勝可能,這種情況下zs肯定能贏。
5+1時(shí),zs不可能選1,因?yàn)闀?huì)輸,必然選5,選5的話,那就反過(guò)來(lái)了,pb肯定能贏。
所以,pb選擇3+3或者5+1方案,避開(kāi)4+2方案,即可戰(zhàn)勝zs,pb有選擇權(quán),所以pb贏。
……
越往下分析越復(fù)雜,但是我們能發(fā)覺(jué)規(guī)律:
如果m為偶數(shù), 那么先手贏(即pb), 如果m為奇數(shù), 那么后手贏(即zs)。
繼續(xù)分析:
我們不管先手怎么走,為了所謂“勝利的目標(biāo)”也好,為了“續(xù)命的事實(shí)”也好,
只要他手里是奇數(shù),為了勝利,都不得不拆成奇數(shù)+偶數(shù)。那么后手只要選擇偶數(shù),他就可以把這個(gè)數(shù)化成m = (m-1) + 1(后手的最優(yōu)策略),把奇數(shù)轉(zhuǎn)移給先手。這樣經(jīng)過(guò)若干次轉(zhuǎn)移之后, 后手手里一定會(huì)是2,然后2 = 1 + 1,后手就贏了。
所以,其實(shí)手里是奇數(shù)的人是沒(méi)有勝算的,所以這個(gè)狀態(tài)是必?cái)B(tài)。而手里是偶數(shù)的人是有必勝的可能的,只有他才有最優(yōu)策略而且只要他按照最優(yōu)策略走,他一定會(huì)贏,因此這個(gè)狀態(tài)是必勝態(tài)。這里我們認(rèn)為每個(gè)人一定能作出對(duì)自己當(dāng)前和全局最有利的決策,所以其實(shí)在一開(kāi)始給出數(shù)值的一瞬間,勝負(fù)已定。
而理解這個(gè)博弈論問(wèn)題的關(guān)鍵,就是擁有偶數(shù)的策略:控制偶數(shù)的一方每次減一,給對(duì)方兩個(gè)奇數(shù)的選項(xiàng),因而不論對(duì)方怎么切割這個(gè)奇數(shù),最終一定會(huì)切成奇數(shù)+偶數(shù),原先控制偶數(shù)的人再選偶數(shù),就可以再次將偶數(shù)態(tài)(必勝態(tài))轉(zhuǎn)移過(guò)來(lái),就一定能一步一步走向勝利。
有位dalao這樣總結(jié)的這個(gè)問(wèn)題:
其實(shí)這里的必?cái)B(tài)(不能控制偶數(shù)的一方)從來(lái)沒(méi)有最佳策略,博弈也不是雙方的博弈,而是處在必勝態(tài)的那方和自己博弈。而這場(chǎng)博弈,由于絕頂聰明的前提,是必勝的,而我們要做的,只是找出誰(shuí)有跟自己博弈的機(jī)會(huì)。
我覺(jué)得這位大佬說(shuō)的特別對(duì),理解很Nice,OrzOrz……
那代碼就很簡(jiǎn)單啦,這里我簡(jiǎn)單的用了一下x&1,表示x%2,判斷奇偶數(shù)用的。
AC代碼(Java語(yǔ)言描述)
import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();List<String> list = new ArrayList<>();for (int i = 0; i < num; i++) {if ((scanner.nextInt() & 1) == 0) {list.add("pb wins");} else {list.add("zs wins");}}scanner.close();for (String s : list) {System.out.println(s);}} }總結(jié)
以上是生活随笔為你收集整理的用博弈论的思想玩游戏(洛谷P3150题题解,Java语言描述)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【C语言】C语言初学者常犯的18条错误
- 下一篇: 【Java】常见的Eclipse快捷键