链接:题意就是告诉你一个扫雷图里面每个雷的位置,有两个人,每个人都知道雷的确切位置,每个人一次可以点一部,问你谁能赢。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4678
思路:整张图有三种格子,一种是空白,一种是带数字的,一种是雷。我们可以根据雷知道整张地图。如果我们点空白那么跟空白连通的数字(不可能有雷)和空白都会显示出来。也就是说数字又可以分为跟空白连着的和不连着的。整个游戏的输赢是与这局所走的总步数有着直接关系,如果是偶数那么后手赢,否则先手赢。那么与空白连着的数字一定被点与否一定会决定着真个游戏的走势,而不与空白相连的数字不管奇偶性都是要被点,他们的奇偶性是不能自身发生改变的。因为每个人都想赢,先手就要将总步数变为奇数,也就是说(空白+被其点的周围数字+独立数字)%2 == 1,而后手相反。假如独立数字是奇数,那么第一个人一定会使空白+期周围数字为偶数,方法就是在空白被点掉前要点掉一个周围数字,而第二个人为了维持步数为偶数他也会点掉数字,也就是说空白周围的数字会影响局势。而我们也可以发现当周围为偶数事,这些数字相当于没有只有空白一个会影响局势,而周围为奇数时,这个空白回影响局势。所以我们只要计算周围数字为奇数的空白个数就可以了,另外偶数的相当于一个独立的数,也就是说当周围数字个数为奇数的空白快的块数为偶数时,那么第一个人赢就要看独立数字和偶数空白数了、
另外注意加扩栈指令
代码:

1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <set> 8 #include <queue> 9 #include <stack> 10 #define loop(s,i,n) for(i = s;i < n;i++) 11 #define cl(a,b) memset(a,b,sizeof(a)) 12 #pragma comment(linker, "/STACK:1024000000,1024000000") 13 using namespace std; 14 int map[1005][1005]; 15 int vis[1005][1005]; 16 int n,m,k; 17 int num,odd,uod; 18 int to[8][2] = {{0,1},{0,-1},{1,0},{1,-1},{1,1},{-1,-1},{-1,0,},{-1,1}}; 19 int judge(int a,int b) 20 { 21 if(a >= 0 && a < n && b>= 0 &&b < m) 22 return 1; 23 return 0; 24 } 25 void paint(int x,int y) 26 { 27 int i,j; 28 for(i = 0;i < 8;i++) 29 { 30 int a,b; 31 a = x+to[i][0]; 32 b = y+to[i][1]; 33 if(judge(a,b) && !vis[a][b]) 34 map[a][b]++; 35 } 36 } 37 void dfs(int x,int y) 38 { 39 if(map[x][y] == -1 || vis[x][y]) 40 return; 41 42 vis[x][y] = 1; 43 int i; 44 for(i = 0;i < 8;i++) 45 { 46 int a,b; 47 a = x+to[i][0]; 48 b = y+to[i][1]; 49 if(judge(a,b)&&vis[a][b] == 0) 50 { 51 if(map[a][b] > 0) 52 num++,vis[a][b] = 1; 53 else if(map[a][b] == 0) 54 dfs(a,b); 55 } 56 } 57 return; 58 } 59 int main() 60 { 61 int t,i,j,x,y; 62 // freopen("data.txt","r",stdin); 63 //freopen("data1.txt","w",stdout); 64 scanf("%d",&t); 65 int icase = 0; 66 while(t--) 67 { 68 scanf("%d %d %d",&n,&m,&k); 69 loop(0,i,n) 70 { 71 loop(0,j,m) 72 map[i][j] = vis[i][j] = 0; 73 } 74 while(k--) 75 { 76 scanf("%d %d",&x,&y); 77 map[x][y] = -1; 78 vis[x][y] = 1; 79 paint(x,y); 80 } 81 odd = uod = 0; 82 ///* 83 loop(0,i,n) 84 { 85 loop(0,j,m) 86 { 87 num = 0; 88 if(map[i][j] == 0 && !vis[i][j]) 89 { 90 dfs(i,j); 91 if(num%2) 92 odd++; 93 else 94 uod++; 95 } 96 } 97 }//*/ 98 loop(0,i,n) 99 { 100 loop(0,j,m) 101 { 102 if(!vis[i][j] && map[i][j] > 0) 103 uod++; 104 } 105 } 106 printf("Case #%d: ",++icase); 107 if(uod%2 || odd%2) 108 puts("Xiemao"); 109 else 110 puts("Fanglaoshi"); 111 } 112 return 0; 113 }