博弈论

代码与解释(取球题目)

#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;
}

posted @ 2023-09-09 12:48  铜锣湾陈昊男  阅读(22)  评论(0)    收藏  举报