题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5546
真是要疯了,一道题并不难的题,由于题意一直读不懂,愣是弄了快3个小时才OK
Mean:
我方棋子是'x',敌方是'o'。现在轮到我方落子,问我方能不能在下一回合吃掉对方的至少一个棋子。
吃掉的规则是:对方被围的棋子在下一回合时已经找不到为' . '的位置,就是我下一个棋子把‘o’包围了。
范围:棋盘大小9*9。
Analse:
枚举每一个'.',使其变成'x',在这一点周围四个点为方向进行DFS,遇到'x'返回,如果存在一个DFS过程中没发现'.'即存在。
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1000005; const int INF=0x3f3f3f3f; char maps[10][10]; int vis[10][10]; int dir[4][2]= {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; int f; void DFS(int x, int y) { vis[x][y]=1; if(maps[x][y]=='.') { f=1; return ; } if(maps[x][y]=='x')return ; for(int i=0; i<4; i++) { int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=0&&nx<9&&ny>=0&&ny<9&&!vis[nx][ny]) DFS(nx, ny); } } int solve() { for(int i=0; i<9; i++) { for(int j=0; j<9; j++) { if(maps[i][j]=='.')///枚举每一个'.' { maps[i][j]='x';///将其变成黑棋 for(int k=0; k<4; k++) { int nx=i+dir[k][0]; int ny=j+dir[k][1]; if(nx>=0&&nx<9&&ny>=0&&ny<9&&maps[nx][ny]=='o')///寻找'.'周围合法的白棋 { memset(vis, 0, sizeof(vis)); f=0; DFS(nx, ny);///判断白棋是否能够被我方黑棋包围 if(!f) return 1; } } maps[i][j]='.';///如果其周围没有白棋或者黑棋包围白棋不成功,还要将其还原为'.' } } } return 0; } int main() { int T, cas=1; scanf("%d", &T); while(T--) { for(int i=0; i<9; i++) scanf("%s", maps[i]); int ans=solve(); if(ans)printf("Case #%d: Can kill in one move!!! ", cas++); else printf("Case #%d: Can not kill in one move!!! ", cas++); } return 0; }