题意:给定一个9*9的棋盘,问黑子能否在下一步将白子围住(四面)。
由于数据不大,可以直接将'.'换成'x',用DFS搜索。
#include<cstdio> #include<cstring> using namespace std; char chess[11][11]; bool visit[11][11]; int turnx[4]={1,-1,0,0}; int turny[4]={0,0,1,-1}; int flag; bool in(int x,int y) { if(x<0||y<0||x>=9||y>=9) return 0; return 1; } void dfs(int x,int y) { if(chess[x][y]=='.')//如果有出路,则标记为0,说明在该点下子无法获胜 { flag=0; return; } for(int k=0;k<4;k++) { int nx=x+turnx[k]; int ny=y+turny[k]; if(in(nx,ny)&&!visit[nx][ny]&&chess[nx][ny]!='x') { visit[nx][ny]=1; dfs(nx,ny); } } } int solve() { for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { if(chess[i][j]=='.') { chess[i][j]='x'; for(int k=0;k<4;k++) { int nx=i+turnx[k]; int ny=j+turny[k]; if(in(nx,ny)&&chess[nx][ny]=='o') { memset(visit,0,sizeof(visit)); visit[nx][ny]=1; flag=1; dfs(nx,ny); if(flag) return 1;//直接返回,跳出循环 } } chess[i][j]='.';//还原 } } } return 0; } int main() { int T,cas=1; scanf("%d",&T); while(T--) { for(int i=0;i<9;i++) scanf("%s",chess[i]); flag=1; memset(visit,0,sizeof(visit)); 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; }