题目2267:蓝桥杯2016年第七届真题-取球博弈

#include<iostream>

#include<algorithm>

using namespace std;

int n[5], vis[1000][2][2];

int dfs(int x, int f, int s) {

if(vis[x][f%2][s%2] != 2) {

return vis[x][f%2][s%2];

}

if(x < n[1]) { // 不能取球了

if((f%2 == 1) && (s%2 == 0)) return 1;

else if((f%2 == 0) && (s%2 == 1)) return -1;

else return 0;

}

int res;

bool ping = false; // 记录是否有平局可能

for(int i = 1; i <= 3; i++) {

if(x - n[i] >= 0) {

res = dfs(x - n[i], s, f + n[i]);

if(res == -1) { // 对手输,我赢

vis[x][f%2][s%2] = 1;

return 1;

}

if(res == 0) { // 有平局可能

ping = true;

}

}

}

if(ping) { // 没有必胜,但有平局

vis[x][f%2][s%2] = 0;

return 0;

}

// 所有选择都导致对手赢

vis[x][f%2][s%2] = -1;

return -1;

}

int main() {

cin >> n[1] >> n[2] >> n[3];

sort(n+1, n+4);//排序范围是 n[1]、n[2]、n[3]

for(int i = 1; i <= 5; i++) {

int x;

cin >> x;

// 初始化vis数组

for(int j = 0; j <= x; j++) {

vis[j][0][0] = vis[j][0][1] = vis[j][1][0] = vis[j][1][1] = 2;

}

int ans = dfs(x, 0, 0);

if(ans == 1) cout << "+ ";

else if(ans == 0) cout << "0 ";

else cout << "- ";

}

return 0;

}

相关推荐
逆境不可逃2 小时前
LeetCode 热题 100 之 152. 乘积最大子数组 416. 分割等和子集 32. 最长有效括号 62. 不同路径
算法·leetcode·职场和发展
DeepModel2 小时前
【概率分布】几何分布超详细解析
算法·概率论
Genevieve_xiao2 小时前
【差分】差分的理解与基础题型总结
数据结构·c++·算法
舟舟亢亢2 小时前
算法总结——【技巧,ACM模式输入】
算法
智者知已应修善业2 小时前
【无序数组指针交换2则】2024-10-28
c语言·数据结构·c++·经验分享·笔记·算法
liulilittle2 小时前
MIMT审计技术:TLS信任链的脆弱性与资本主义商业逻辑下的必然
网络·c++·tcp/ip·tls·mimt
一叶落4382 小时前
LeetCode 136. 只出现一次的数字(C语言详解 | 哈希表 + 排序 + 位运算)
c语言·数据结构·算法·leetcode·哈希算法·散列表
古译汉书2 小时前
【数据结构算法】二分查找
c语言·开发语言·数据结构·c++·算法
逆境不可逃2 小时前
【从零入门23种设计模式19】行为型之观察者模式
java·开发语言·算法·观察者模式·leetcode·设计模式·动态规划