游戏是这样的,有两个人,A和B,一开始A和B各有两个数字A1,A2,B1,B2,数值都是1。轮到A或者B时则可以将自己的数字加上对方的数字并模10。(如本轮到A,如果A选择将A1加上B1,则A1 = (B1+A1)%10。)自己的数字任意一个数字最先变成0的获胜。
一个经典的博弈论,然而自己又写挂了,求大佬们找找错
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int mp[20][20][20][20], n;
int vis[20][20][20][20];
vector<int> G1[maxn], G2[maxn];
int na=1, nb=1, nc=1, nd=1, mod=1;
int cvt(int a, int b, int c, int d){
return a*1000+b*100+c*10+d;
}
void add(int a, int b, int c, int d, int now){
if (vis[a][b][c][d] || mp[a][b][c][d]) return;
vis[a][b][c][d] = 1;
if (now == 1){
if (!vis[(a+c)%10][b][c][d]) {
G1[cvt(a, b, c, d)].push_back(cvt((a+c)%10, b, c, d));
// cout<<"ok11"<<endl;
}
if (!vis[(a+d)%10][b][c][d]){
G1[cvt(a, b, c, d)].push_back(cvt((a+d)%10, b, c, d));
// cout<<"ok12"<<endl;
}
if (!vis[a][(b+c)%10][c][d]) {
G1[cvt(a, b, c, d)].push_back(cvt(a, (b+c)%10, c, d));
// cout<<"ok13"<<endl;
}
if (!vis[a][(b+d)%10][c][d]){
G1[cvt(a, b, c, d)].push_back(cvt(a, (b+d)%10, c, d));
// cout<<"ok14"<<endl;
}
add(a, (b+c)%10, c, d, 2);
add((a+d)%10, b, c, d, 2);
add((a+c)%10, b, c, d, 2);
add(a, (b+d)%10, c, d, 2);
}
else if (now == 2){
if (!vis[a][b][(c+a)%10][d]) G2[cvt(a, b, c, d)].push_back(cvt(a, b, (c+a)%10, d));
add(a, b, (c+a)%10, d, 1);
if (!vis[a][b][(c+b)%10][d]) G2[cvt(a, b, c, d)].push_back(cvt(a, b, (c+b)%10, d));
add(a, b, (c+b)%10, d, 1);
if (!vis[a][b][c][(d+a)%10]) G2[cvt(a, b, c, d)].push_back(cvt(a, b, c, (d+a)%10));
add(a, b, c, (d+a)%10, 1);
if (!vis[a][b][c][(d+b)%10]) G2[cvt(a, b, c, d)].push_back(cvt(a, b, c, (d+b)%10));
add(a, b, c, (d+b)%10, 1);
}
}
int search(int a, int b, int c, int d, int now){
if (vis[a][b][c][d]) return mp[a][b][c][d];
vis[a][b][c][d] = 1;
if (mp[a][b][c][d]) return mp[a][b][c][d];
if (now == 1){
for (int i=0; i<G1[cvt(a, b, c, d)].size(); i++){
int v = G1[cvt(a, b, c, d)][i];
int va = (v/1000)%10, vb = (v/100)%10, vc = (v/10)%10, vd = v%10;
if (!vis[va][vb][vc][vd]) {
int res = search(va, vb, vc, vd, 2);
if (res == 1) {
mp[a][b][c][d] = res;
}
}
}
if (!mp[a][b][c][d]){
mp[a][b][c][d] = 2;
return 2;
}
else return 1;
}
else if (now == 2){
for (int i=0; i<G2[cvt(a, b, c, d)].size(); i++){
int v = G2[cvt(a, b, c, d)][i];
int va = (v/1000)%10, vb = (v/100)%10, vc = (v/10)%10, vd = v%10;
if (!vis[va][vb][vc][vd]) {
int res = search(va, vb, vc, vd, 1);
if (res == 2) {
mp[a][b][c][d] = res;
}
}
}
if (!mp[a][b][c][d]){
mp[a][b][c][d] = 1;
return 1;
}
else return 2;
}
}
void find(int a, int b, int c, int d, int now){
if (now == 1){
for (int i=0; i<G1[cvt(a, b, c, d)].size(); i++){
int v = G1[cvt(a, b, c, d)][i];
int va = (v/1000)%10, vb = (v/100)%10, vc = (v/10)%10, vd = v%10;
if (mp[va][vb][vc][vd] == 1){
cout<<va<<" "<<vb<<" "<<vc<<" "<<vd<<endl;
na = va, nb = vb, nc = vc, nd = vd;
mod = 2;
}
}
}
}
int main(){
for (int i=1; i<10; i++){
for (int j=1; j<10; j++){
for (int k=1; k<10; k++){
mp[0][i][j][k] = 1;
mp[i][0][j][k] = 1;
mp[i][j][0][k] = 2;
mp[i][j][k][0] = 2;
}
}
}
add(1, 1, 1, 1, 1);
memset(vis, 0, sizeof(vis));
search(1, 1, 1, 1, 1);
cout<<mp[1][2][1][3]<<endl;
while (1){
if (mod == 1) find(na, nb, nc, nd, 1);
else {
cin>>na>>nb>>nc>>nd;
mod = 1;
}
}
system("pause");
}