和同学玩游戏时想到的一个问题
  • 板块学术版
  • 楼主ParanoidMO
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/5/1 20:11
  • 上次更新2023/10/28 02:27:58
查看原帖
和同学玩游戏时想到的一个问题
218188
ParanoidMO楼主2022/5/1 20:11

游戏是这样的,有两个人,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");
}
2022/5/1 20:11
加载中...