取球問題
今盒子里有n個(gè)小球限嫌,A靴庆、B兩人輪流從盒中取球,每個(gè)人都可以看到另一個(gè)人取了多少個(gè)怒医,
也可以看到盒中還剩下多少個(gè)炉抒,并且兩人都很聰明,不會(huì)做出錯(cuò)誤的判斷稚叹。
我們約定:
每個(gè)人從盒子中取出的球的數(shù)目必須是:1焰薄,3拿诸,7或者8個(gè)。
輪到某一方取球時(shí)不能棄權(quán)塞茅!
A先取球亩码,然后雙方交替取球,直到取完野瘦。
被迫拿到最后一個(gè)球的一方為負(fù)方(輸方)
請(qǐng)編程確定出在雙方都不判斷失誤的情況下描沟,對(duì)于特定的初始球數(shù),A是否能贏鞭光?
程序運(yùn)行時(shí)吏廉,從標(biāo)準(zhǔn)輸入獲得數(shù)據(jù),其格式如下:
先是一個(gè)整數(shù)n(n<100)惰许,表示接下來有n個(gè)整數(shù)席覆。然后是n個(gè)整數(shù),每個(gè)占一行(整數(shù)<10000)汹买,表示初始球數(shù)佩伤。程序則輸出n行,表示A的輸贏情況(輸為false晦毙,贏為true)生巡。
/*
設(shè)置一個(gè)f函數(shù),表示這個(gè)取球的局面结序,返回的是勝負(fù)(boolean值) f(局面x) --> 勝負(fù)障斋?
邊界條件處理...
for(對(duì)我所有可能的走法){
試著走一步-->局面y
勝負(fù)t=f(y)
if(t==負(fù)) return 勝 如果對(duì)方輸了纵潦,那么我就勝利了
恢復(fù)局面
}
return 負(fù)
*/
public class 博弈問題1_取球問題 {
public static void main(String[] args) {
System.out.println(f(10));
}
public static boolean f(int n) {
if (n >= 8 && f(n - 8) == false) return true;
if (n >= 7 && f(n - 7) == false) return true;
if (n >= 3 && f(n - 3) == false) return true;
if (n >= 1 && f(n - 1) == false) return true;
return false;
}
}