题目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;

}

相关推荐
于小猿Sup15 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
x_yeyue16 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao17 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路17 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星17 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路17 小时前
C++ 多线程与并发
java·jvm·c++
失去的青春---夕阳下的奔跑17 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光18 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩18 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947318 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表