参考于:http://hi.baidu.com/upc_refresh/blog/item/9f08f5bb85adc5aeca130c6a.html
题意:求黑白棋子哪一个棋子围住的空白地方多。
思路:DFS没有棋子的地方,同时记录边界是黑白棋子的个数,如果黑棋子个数是0,那么白色棋子围住的地方等于搜到的地方,反之相反。
#include<iostream>
#include<cstdio>
using namespace std;
bool vis[30][30];
char map[30][30];
int bb , ww , n , cnt;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int i , int j) {
int k , xx , yy;
vis[i][j] = 1;
cnt++;
for(k = 0 ; k < 4 ; k ++) {
xx = i + dir[k][0];
yy = j + dir[k][1];
if(xx>0&&xx<=n&&yy>0&&yy<=n) {
if(map[xx][yy]==' '&&!vis[xx][yy]) dfs(xx , yy);//如果有没搜过的空地,继续搜
if(map[xx][yy]=='b') bb++;//如果这个空地的周围有黑棋子那么统计下来
if(map[xx][yy]=='w') ww++; //统计白棋子
}
}
}
int main() {
int nb , nw , b , w , i , j , x , y;
while(scanf("%d%d%d",&n,&nb,&nw)!=EOF) {
if(n == 0) break;
memset(vis ,0 ,sizeof(vis));
for(i = 1 ; i <= n ; i ++)
for(j = 1 ; j <= n ; j ++)
map[i][j] = ' ';
for(i = 0 ; i < nb ; i ++) {
scanf("%d%d",&x,&y);
map[x][y] = 'b';
}
for(i = 0 ; i < nw ; i ++) {
scanf("%d%d",&x,&y);
map[x][y] = 'w';
}
b = w = 0;
for(i = 1 ; i <= n ; i ++)
for(j = 1 ; j <= n ; j ++) {
if(map[i][j]==' '&&vis[i][j]==0) {
bb = ww = 0;
cnt = 0;
dfs(i , j);
if(bb==0)
w += cnt;
if(ww==0)
b += cnt;
}
}
if(b==w) printf("Draw\n"); //如果黑白棋子围住的地方大小相同,那么平局
if(b>w) printf("Black wins by %d\n",b-w);
if(b<w) printf("White wins by %d\n",w-b);
}
}