藍橋杯-取球博弈
題目
今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方取球時不能棄權! A先取球,然後雙方交替取球,直到取完。 被迫拿到最後一個球的一方為負方(輸方) 請程式設計確定出在雙方都不判斷失誤的情況下,對於特定的初始球數,A是否能贏? 程式執行時,從標準輸入獲得資料,其格式如下: 先是一個整數n(n<100),表示接下來有n個整數。然後是n個整數,每個佔一行(整數<10000),表示初始球數。 程式則輸出n行,表示A的輸贏情況(輸為0,贏為1)。 例如,使用者輸入:
4
1
2
10
18則程式應該輸出:
0
1
1
0思路
這是一個很典型的迭代問題。對於N(>8)個球,A有四種策略,取1個,取3個,取7個,取8個,相對應的,B就得到(N-1),(N-3),(N-7),(N-8)。對於A來說,只要這四種有一種是贏得情況,就採取這種方法。於是提煉出一個表示式
F(n) = ! ( F(n-1) || F(n-3) || F(n-7) || F(n-8))
是不是這樣就很完美的解決問題了呢?我覺得不是,因為在求F(n),我們需要去求 F(n-1), F(n-3),F(n-7) 和 F(n-8)。在求 F(n-1)的時候,我們得到一些在求 F(n-3),F(n-7) 和 F(n-8)可能會用上的結果,但是我們之後又去重複的求取,改進之處是保留這些結果。就用陣列儲存吧。
- 程式碼
import java.util.Scanner;
public class FetchBall {
//之所以沒有用boolean是因為有三種狀態需要記錄
static int[] mem = new int[10001];
public static void main(String[] args) {
//為了方便程式,記輸為2,贏為1,沒有記錄的為0
mem[1] = mem[3] = mem[5] = mem[7] = 2;
mem[2] = mem[4] = mem[6] = mem[8] = 1 ;
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for(int i=0;i<N;i++) {
int t = sc.nextInt();
System.out.println(fetch(t)==2?0:1);
}
}
static int fetch(int n) {
if(n>8&&mem[n]==0) {
if(fetch(n-1)==2)
mem[n] = 1;
else if(fetch(n-3)==2)
mem[n] = 1;
else if(fetch(n-7)==2)
mem[n] = 1;
else if(fetch(n-8)==2)
mem[n] = 1;
else
mem[n] = 2;
}
return mem[n];
}
}
- 結果
4
12
1
345
1
67
0
987
1
相關推薦
第七屆藍橋杯取球博弈詳解
取球博弈兩個人玩取球的遊戲。一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個
藍橋杯—取球博弈
取球博弈今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定:每個人從盒子中取出的球的數目必須是:1,3,7或者8個。輪到某一方取球時不能棄權!A先取球,然後雙方交替取球,
藍橋杯 取球博弈
取球博弈兩個人玩取球的遊戲。一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個數目。如果無法繼續取球,則遊戲結束。此時,持有奇數個球的一方獲勝。如果兩人都是奇數,則為平局。假設雙方都採用最聰明的取法,第一個取球的人一定能贏嗎?試程式設計解決這個問題。輸入
藍橋杯-取球博弈
題目 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方取球時不能棄權!
藍橋杯 取球遊戲 博弈
Problem Description 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方
藍橋杯 取球遊戲(博弈)
Problem Description 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方
【藍橋杯練習題】取球博弈
今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定:
取球博弈問題 藍橋杯
取球博弈這個問題思路比較明確就是將兩個人所有可能取的情況進行遍歷,最後看兩個人手中球數量奇偶。遍歷的話可採用深度優先搜尋 不過直接深度優先搜尋肯定不行,因為如果有1000個球那麼每次有三種取
取球博弈--藍橋杯
簡述 這是2012年藍橋杯全國軟體大賽預賽(C++本科組)第10題,實質是已知球的數量,規定取球方法,判斷先取球的人的輸贏。 題目描述 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰
藍橋杯大賽--取球博弈
今盒子裡有 n個小球,A 、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個, 也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的球的數目必須
JAVA藍橋杯(18)取球博弈
問題描述 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個, 也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的
2016年藍橋杯java B組第9題取球博弈
import java.util.Scanner; class Problem { private int N; private char[][][] dp; private int[] n = new int[3]; private int min = Integ
嘔心瀝血演算法題——取球博弈
// 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個, // 也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 // 我們約定: // 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 // 輪到某一方取球時不能棄權! // A先取球,
不連續取球(取球博弈)
今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方取球
經典演算法之博弈論 取球博弈
問題描述: 取球博弈.局面上有一堆球,二人博弈,每人一次只能取1,3,7或者8個球.要求輸出局面有n個球時的勝負情況. 解題思路: 這裡我提供兩種題解,一種是純遞迴求解,但純遞迴CPU消耗過大,後面我還會提供動態規劃+快取的題解方法. 實現方式一: *純遞迴解題,
藍橋杯歷屆試題——取球遊戲(博弈論)
取球遊戲 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定: 每個人從
藍橋杯真題 取球遊戲 題解
題目: 今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方取球時不能棄權! A先取球,
取球遊戲——第三屆藍橋杯省賽C語言A組第10題
今盒子裡有n個小球,A、B兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 每個人從盒子中取出的球的數目必須是:1,3,7或者8個。 輪到某一方取球時不能棄權! A先取球,然後雙方交替取球,直
盒子取球C語言 藍橋杯
std 取出 取值 void 根據 特定 我們 i++ n) 盒子取球方法二今盒子裏有 n 個小球,A、B 兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個, 也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。 我們約定:每個人從盒子中取出的球的數
藍橋杯-地宮取寶
狀態 sca lock color wid 記憶化dfs info scan 可能 問題描述 X 國王有一個地宮寶庫。是 n x m 個格子的矩陣。每個格子放一件寶貝。每個寶貝貼著價值標簽。 地宮的入口在左上角,出口在右下角。 小明被帶到地宮的入口,國王要求