HDU 4678 - Mine - BFS + Game Theory
2013-08-16 16:37
344 查看
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4678
先BFS,记录点击空白区域时打开的数字个数num,num为奇数时,sg=2,偶数则sg=1 :sg=(num%2)+1
没有与空格相连的格子,每个sg=1
nim=0 , 然后与所有的sg异或后,puts(nim?P:N)
一开始写SB了,生成扫雷地图时,没有判断是否当前是否为地雷,然后就+1了,导致最后计算没有与空白相连的格子个数是算错,然后一直WA
后来计算 总格数(n*m)-空白格数-与空白相连数字格数 然后A掉,A掉后才发现一开始的SB错误
AC Code:
先BFS,记录点击空白区域时打开的数字个数num,num为奇数时,sg=2,偶数则sg=1 :sg=(num%2)+1
没有与空格相连的格子,每个sg=1
nim=0 , 然后与所有的sg异或后,puts(nim?P:N)
一开始写SB了,生成扫雷地图时,没有判断是否当前是否为地雷,然后就+1了,导致最后计算没有与空白相连的格子个数是算错,然后一直WA
后来计算 总格数(n*m)-空白格数-与空白相连数字格数 然后A掉,A掉后才发现一开始的SB错误
AC Code:
//AcerGY //#pragma comment (linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #include <vector> #include <cmath> #define ll long long #define BUG puts("BUG!") #define ci(val) scanf("%d",&val) #define pi(val) printf("%d\n",val) #define clr(a,val) memset(a,val,sizeof(a)) #define lowbit(x) ((x)&(-x)) #define inf 0x3f3f3f3f #define inf64 1LL<<60 #define PI acos(-1.0) #define eps 1e-8 //Game Theory #define P "Xiemao" #define N "Fanglaoshi" #define maxn 1010 #define mod 10009 #define mid ((l+r)>>1) #define ls rt<<1 #define rs ls|1 #define lson l,mid,ls #define rson mid+1,r,rs using namespace std; void readfile(char s[]) { #ifndef ONLINE_JUDGE freopen(s,"r",stdin); #endif } struct node { int x,y; int flag;//0表示空白,1是数字或雷 }; int g[maxn][maxn]; int n,m,k; int dir[8][2]={{0,1},{0,-1},{1,0},{1,-1},{1,1},{-1,0},{-1,1},{-1,-1}}; void deal(int x,int y) { for(int i=0;i<8;i++) { int mx = x+dir[i][0] , my = y+dir[i][1]; if(g[mx][my]!=-1) g[mx][my] = 1; } } bool In(int x,int y) { if(x>=1 && x<=n && y>=1 && y<=m) return true; return false; } pair<int,int> bfs(node s) { int x = 0 , ans = 0; queue<node> q; node u,v; g[s.x][s.y] = -1; q.push(s); while(!q.empty()) { u = q.front();q.pop(); if(u.flag==0) x++; for(int i=0;i<8;i++) { v.x = u.x + dir[i][0]; v.y = u.y + dir[i][1]; v.flag = g[v.x][v.y]==0?0:1; //当前在游戏区域 && pre为空格 && 当前不是地雷 if(In(v.x,v.y) && ((u.flag==0) && (g[v.x][v.y]>=0))) { //已访问 g[v.x][v.y] = -1; //若为数字,记录+1 if(v.flag==1) ans++; q.push(v); } } } return make_pair(x,ans); } int main() { ios::sync_with_stdio(0); readfile("1003.txt"); int T , cas = 1; node s; cin>>T; while(T--) { scanf("%d%d%d",&n,&m,&k); clr(g,0); int nim = 0 , x , y; //非单独数字格数 int sum = k; while(k--) { scanf("%d%d",&x,&y); x++;y++; g[x][y] = -1; deal(x,y); } //输出处理后map //puts(""); //for(int i=1;i<=n;i++) //{ // for(int j=1;j<=m;j++) // { // printf("%2d ",g[i][j]); // } // puts(""); //} printf("Case #%d: ",cas++); if(k==0) { puts(P);continue; } //bfs空白区域 for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(g[i][j]==0) { s.x = i , s.y = j , s.flag = 0; //printf("coo:%d,%d\n",i,j); pair<int,int> ans= bfs(s); sum += ans.first+ans.second; int t = ans.second; //printf("t=%d\n",t); nim ^= (t%2)+1; } } } //输出bfs后map //puts(""); //for(int i=1;i<=n;i++) //{ // for(int j=1;j<=m;j++) // { // printf("%2d ",g[i][j]); // } // puts(""); //} //int num = 0; //for(int i=1;i<=n;i++) // for(int j=1;j<=m;j++) // if(g[i][j]==1) // num++; //nim^=num%2; //printf("n*m-sum=%d\n",n*m-sum); nim ^= (n*m-sum)%2; //output puts(nim?P:N); } return 0; }
相关文章推荐
- HDU-4678 Mine(BFS,NIM博弈,SG函数)
- HDU-3295-An interesting mobile game(BFS+DFS)
- hdu 4678 Mine(SG博弈)
- hdu 4678 Mine(博弈SG,4级)
- HDU 4678 Mine
- hdu 4678 Mine(博弈SG,4级)
- HDU-4678 Mine 博弈SG函数
- hdu - 2216 Game III && xtu 1187 Double Maze (两个点的普通bfs)
- HDU 4678 Mine
- HDU 4678 Mine 解题报告
- hdu 4678 Mine 博弈论
- hdu 5945 Fxx and game(单调队列OR标记过程的bfs)@
- HDU 5945 Fxx and game 单调队列||bfs
- HDU 4678 Mine (博弈SG+自由度原理)
- HDU 4678 Mine (博弈)
- hdu 4678 Mine
- hdu 3295 An interesting mobile game(bfs)
- HDU-5945 Fxx and game (BFS)
- hdu 4678 Mine 多校第八场
- HDU-5945 Fxx and game (单调队列与BFS)