本文主要是介绍hdu 1524 A Chess Game 博弈论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
两个人在一个有向五环图上面走棋子,每次只能走一步,最后谁
* 没有棋子可走就败,然后棋子可以重叠,并且有n个棋子。要求判断* 先手的胜负。
纠结了好长时间一直在想为什么sg函数要呢么定义然后看了各种博客但是只是讲了,定义的内容却很少有讲为什么的。。。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int Map[1005][1005];
int sg[1005],n;
int dfs(int a)
{if(sg[a]!=-1)return sg[a];bool vis[2000]={0};for(int i=0;i<n;i++){if(Map[a][i]==1){vis[dfs(i)]=1;}}for(int i=0;i<n;i++)if(vis[i]==0)return sg[a]=i;
}
int main()
{while(~scanf("%d",&n)){memset(sg,-1,sizeof(sg));memset(Map,0,sizeof(Map));for(int i=0; i<n; i++){int a;scanf("%d",&a);if(a==0) //注意这个地方,这个地方是当没有后继的时候他的sg函数为0{sg[i]=0;continue;}while(a--){int b;scanf("%d",&b);Map[i][b]=1;}}int m;while(~scanf("%d",&m)&&m){int ans=0;for(int i=0;i<m;i++){int a;scanf("%d",&a);if(sg[a]!=-1)ans^=sg[a];elseans^=dfs(a);}if(ans==0)printf("LOSE\n");elseprintf("WIN\n");}}return 0;
}
这篇关于hdu 1524 A Chess Game 博弈论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!