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

}

相关推荐
Darkwanderor4 小时前
什么数据量适合用什么算法
c++·算法
超绝振刀怪4 小时前
【C++多态】
开发语言·c++
zc.ovo4 小时前
河北师范大学2026校赛题解(A,E,I)
c++·算法
py有趣4 小时前
力扣热门100题之环形链表
算法·leetcode·链表
py有趣4 小时前
力扣热门100题之回文链表
算法·leetcode·链表
Kk.08025 小时前
数据结构|链表 刷题
数据结构·链表
学嵌入式的小杨同学5 小时前
STM32 进阶封神之路(三十九)FreeRTOS 临界区、挂起 / 删除、钩子函数、调度底层原理|从应用到内核深度解析
c++·stm32·单片机·嵌入式硬件·mcu·硬件架构·pcb
oioihoii5 小时前
Cursor根本无法调试C++
开发语言·c++
月落归舟6 小时前
帮你从算法的角度来认识二叉树---(二)
算法·二叉树