HDU 4155 The Game of 31 (博弈)
2015-11-22 02:09
323 查看
题意:
1,2,3,4,5,6各有4张一共24张牌,2个人拿牌,要求牌的总和不能超过31,超过了不能拿,谁不能拿谁输
分析:
博弈基本思想:
当前是必胜态,当且仅当有一个后继是必败态
当前是必败态,当且仅当所有后继是必胜态
没有后继的是必败态
其实第一个拿到31的是必胜态,写的时候反过来看起来跑得快
代码:
1,2,3,4,5,6各有4张一共24张牌,2个人拿牌,要求牌的总和不能超过31,超过了不能拿,谁不能拿谁输
分析:
博弈基本思想:
当前是必胜态,当且仅当有一个后继是必败态
当前是必败态,当且仅当所有后继是必胜态
没有后继的是必败态
其实第一个拿到31的是必胜态,写的时候反过来看起来跑得快
代码:
// // Created by TaoSama on 2015-11-21 // Copyright (c) 2015 TaoSama. All rights reserved. // //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " " #define prln(x) cout << #x << " = " << x << endl const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; int card[10]; char s[20]; bool dfs(int sum) { if(sum == 31) return false; for(int i = 1; i <= 6; ++i) { if(sum + i > 31) break; if(!card[i]) continue; --card[i]; bool F = dfs(sum + i); ++card[i]; if(!F) return true; } return false; } int main() { #ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin); // freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); while(scanf("%s", s) == 1) { for(int i = 1; i <= 6; ++i) card[i] = 4; int sum = 0; int n = strlen(s); for(int i = 0; i < n; ++i) { --card[s[i] - '0']; sum += s[i] - '0'; } printf("%s ", s); //这里必败和必胜反过来了 if(dfs(sum)) printf("%c\n", "AB"[n & 1]); //必败 else printf("%c\n", "BA"[n & 1]); //必胜 } return 0; }
相关文章推荐
- [FAFU 1292]博弈论,组合游戏,取石游戏
- Sicily 1305 Who’s Winner?
- Andrew Stankevich Contest 38 , J-Jackpot
- 纸牌博弈问题
- uva 12293 Box Game
- hdu 1846 (博弈)
- HDU 1849(尼姆博弈)
- hdu 1847(博弈)
- hdu 1850(妮姆博奕)
- HDU 1079 Calendar Game
- cf 276b 博弈
- SG-分石子游戏
- 博弈-取石子
- 博弈-威佐夫博弈
- 博弈-巴什博弈
- 博弈-Nim博弈
- 编程之美1.13 威佐夫博奕拓展的分析与论证
- 编程之美1.13 威佐夫(NIM)博奕(Wythoff Game)涉及的数学定理论证
- 取石子游戏-博弈
- 取石子游戏