- 博弈论
本体运用到了基础博弈论的相关知识点,博弈论的本质是让自己处于必胜状态,他人处于必输状态
,找到必输
状态是核心
- 博弈论两条状态转换公式
1. 当前处于必输状态 ⇔ 下一步总能进入必胜状态 2. 存在一种策略 , 使得下一步进入必输状态 ⇒ 当前处于必胜状态 1.当前处于必输状态\Leftrightarrow 下一步总能进入必胜状态 \\ 2.存在一种策略,使得下一步进入必输状态\Rightarrow 当前处于必胜状态 1.当前处于必输状态⇔下一步总能进入必胜状态2.存在一种策略,使得下一步进入必输状态⇒当前处于必胜状态
- 算法模板
#include<iostream>
#include<bits/stdc++.h>
#include <queue>
#include <algorithm>
using namespace std;
vector<vector<int>> m(3,vector<int>(5,0));
vector<vector<int>> num(3,vector<int>(5,0));
const int N=1<<8;
map<int,bool> dp;
bool check(int x){
int num=0;
int i=0;
while(i<8){
if(x%2==0) num++;
x=(x>>1);
i++;
}
if(num==1) return true;
else return false;
}
bool dfs(int x){
if(x==N-1) return true;
if(check(x)) return false;
if(dp.find(x)!=dp.end()) return dp[x];
bool flag=true;
for(int i=1;i<=2;i++){
for(int j=1;j<=3;j++){
if(m[i][j]==1||m[i][j+1]==1) continue;
m[i][j]=m[i][j+1]=1;
x=x+(1<<num[i][j])+(1<<num[i][j+1]);
dp.emplace(x,dfs(x));
flag=dp[x];
x=x-(1<<num[i][j])-(1<<num[i][j+1]);
m[i][j]=m[i][j+1]=0;
if(flag==false) return true;
}
}
for(int i=1;i<=2;i++){
for(int j=1;j<=4;j++){
if(m[i][j]==1) continue;
m[i][j]=1;
x=x+(1<<num[i][j]);
dp.emplace(x,dfs(x));
flag=dp[x];
x=x-(1<<num[i][j]);
m[i][j]=0;
if(flag==false) return true;
}
}
return false;
}
int main(){
int countNum=0;
for(int i=1;i<=2;i++){
for(int j=1;j<=4;j++){
num[i][j]=countNum;
countNum++;
}
}
bool res[4];
m[1][1]=1;
dp.emplace(1,dfs(1));
res[0]=dp[1];
m[1][1]=0;
m[1][1]=m[1][2]=1;
dp.emplace(3,dfs(3));
res[1]=dp[3];
m[1][1]=m[1][2];
m[1][2]=1;
dp.emplace(2,dfs(2));
res[2]=dp[2];
m[1][2]=0;
m[1][2]=m[1][3]=1;
dp.emplace(6,dfs(6));
res[3]=dp[6];
m[1][2]=m[1][3]=0;
for(int i=0;i<=3;i++){
if(res[i]==false) cout<<"V";
else cout<<"L";
}
return 0;
}