本文主要是介绍hdu2873 Bomb Game,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Bomb Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 440 Accepted Submission(s): 206
1.If p>1 and q>1, the bomb will split up into two bombs located at (u, q) and (p, v), u<p, v<q, u and v are chosen by the player.
2.If p=1 and q>1, one new bomb will be produced, located at (p, v), v<q, v can be chosen freely by the player.
3.If q=1 and p>1, one new bomb will be produced, located at (u, q), u<p, u can be chosen freely by the player.
If two bombs located at the same position or a bomb located at (1, 1), they will be exploded automatically without producing new bombs.
Two players play in turn, until one player cannot explode the bombs and loses the game.
John always plays first.
Now, we’ll give you an initial situation, and you should tell us who will win at last. Assume John and Jack are smart enough, and they always do the best choice.
The input is terminated by n=m=0.
2 2 .# .. 2 2 .# .# 0 0
John Jack可以直接根据sg 函数,直接打表求出sg的值 ,这样就可以转化成一般的nim游戏了!sg函数的定义:
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的SG函数如下:sg(x)=mex{ sg(y) | y是x的后继 },即一个节点的sg函数值等于其所有后继结点的sg函数值集合的mex
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define M 55 int pri[M][M],map[10000]; int getsg(int a,int b){int i,j;mem(map,0);for(i=0;i<a;i++)for(j=0;j<b;j++){map[pri[a][j]^pri[i][b]]=1;}for(i=0;;i++){if(!map[i])return i;} } int main() {int n,m,ans,i,j;char c;mem(pri,-1);for(i=0;i<M;i++)pri[0][i]=pri[i][0]=i;for(i=1;i<M;i++)for(j=1;j<M;j++){pri[i][j]=getsg(i,j);}while(scanf("%d%d",&n,&m)!=EOF&&n+m){getchar();for(ans=0,i=0;i<n;i++){for(j=0;j<m;j++){c=getchar();if(c=='#'){ans^=pri[i][j];}}getchar();}if(ans)printf("John\n");else printf("Jack\n");}return 0; }
这篇关于hdu2873 Bomb Game的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!