博弈论
代码与解释(取球题目)
#include<iostream>
using namespace std;
/*
给定你n个球,有两个人在取球,每个人一次只能取1、3、7、8,每个人做出的每一
个决策都是对自己最有利的决策,那么在抑制我先取球的情况下,我是不是能胜出呢?
*/
//首先需要理解的是局面,一个局面对于我来说是不是胜利的,如果是的,那么就是必胜态
//反之,就是必输态
//规则矩阵,一次只能取得1、3、7、8
int rule[4];
bool f(int x) {
for(int i = 0; i < 4; i++) {
//球的个数大于等于规则i,并且对面是输的,那么我赢了
if(x >= rule[i] && f(x - rule[i]) == false) {
return true;
}
}
return false;
}
int main()
{
rule[0] = 1;
rule[1] = 3;
rule[2] = 7;
rule[3] = 8;
cout << f(4);
return 0;
}
结果
f(10) = true;
f(4) = false;
代码与解释(灭鼠先锋)
http://oj.ecustacm.cn/problem.php?id=2022
#include<bits/stdc++.h>
using namespace std;
//一定要注意最后的判断,不要按照直觉来办事,看清题目的要求是下满棋盘才是输的
///判断是否仅存在一个空格
bool check(string s){
int tot = 0;
for(auto x : s){
if(x == 'O')
tot++;
}
return tot == 1;
}
bool dfs(string s){
if(check(s))
return false;
///模拟放1个棋子
for(int i = 0; i < s.size(); i++)
{
if(s[i] == 'X') {
continue;
}
bool first = true, second = true;
string tmp = s;
tmp[i] = 'X';
first = dfs(tmp);
tmp[i] = 'O';
if(s[i] == 'O' && s[i + 1] == 'O' && i != 3 && i != 7){
tmp[i] = tmp[i + 1] = 'X';
second = dfs(tmp);
tmp[i] = tmp[i + 1] = 'O';
}
if(first == false || second == false) {
return true;
}
}
///模拟放2个棋子
// for(int i = 0; i < s.size() - 1; i++)if(s[i] == 'O' && s[i + 1] == 'O' && i != 3)
// {
// string tmp = s;
// tmp[i] = tmp[i + 1] = 'X';
// if(dfs(tmp) == false)///可以到达必败态均为必胜态
// return true;
// }
///运行到此,说明只能转移到必胜态,此时为必败态
return false;
}
int main(){
string s[] = {"XOOOOOOO", "XXOOOOOO", "OXOOOOOO", "OXXOOOOO"};
for(int i = 0; i < 4; i++)
{
if(dfs(s[i]))cout<<"L";///此时为必胜态,说明后手面临的局面必胜,输出L
else cout<<"V";
}
return 0;
}

浙公网安备 33010602011771号