G - Ancient Go
2
.......xo
.........
.........
..x......
.xox....x
.o.o...xo
..o......
.....xxxo
....xooo.
......ox.
.......o.
...o.....
..o.o....
...o.....
.........
.......o.
...x.....
........o
Sample Output
Case #1: Can kill in one move!!!
Case #2: Can not kill in one move!!!
题意:下围棋规则,给你一个9*9的棋盘:上面有圈叉,现在轮到你下叉子,判断是否能够杀死至少一枚圈
题解;直接枚举所有下子的情况,判断是否叉围住了至少一个圈。……——……
///1085422276 #include<bits/stdc++.h> using namespace std ; typedef long long ll; #define mem(a) memset(a,0,sizeof(a)) #define meminf(a) memset(a,127,sizeof(a)) #define FOR(i,a,b) for( int i=a;i<=b;i++) #define inf 100000 inline ll read() { ll x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘)f=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*f; } //**************************************** #define maxn 11 int ss[4][2]={-1,0,0,-1,1,0,0,1}; bool flag,vis[maxn][maxn]; char mp[maxn][maxn]; bool check(int x,int y){ if(x<0||y<0||x>=9||y>=9)return 1; return 0; } void dfs(int x,int y){ if(flag)return ; for(int i=0;i<4;i++){ int xx=x+ss[i][0]; int yy=y+ss[i][1]; if(check(xx,yy)||vis[xx][yy])continue; if(mp[xx][yy]==‘.‘){ flag=1;return ; } if(mp[xx][yy]==‘o‘){ vis[xx][yy]=1; dfs(xx,yy); if(flag)return ; } } } int main(){ int T=read(); int oo=1; while(T--){ for(int i=0;i<9;i++){ scanf("%s",mp[i]); } bool GG=0; for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ if(mp[i][j]==‘.‘){ mp[i][j]=‘x‘; for(int k=0;k<4;k++){ mem(vis); int xx=i+ss[k][0]; int yy=j+ss[k][1]; if(check(xx,yy))continue; if(mp[xx][yy]==‘o‘) { flag=0; vis[xx][yy]=1; dfs(xx,yy); if(!flag){ GG=1;//cout<<i<<" "<<j<<endl; } if(GG){break;} } } mp[i][j]=‘.‘; } if(GG){break;} } if(GG){break;} } printf("Case #%d: ",oo++); if(GG){ cout<<"Can kill in one move!!!"<<endl; } else { cout<<"Can not kill in one move!!!"<<endl; } } return 0; }
原文:http://www.cnblogs.com/zxhl/p/4924258.html