hdu 4158 GO

参考于: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);
    }    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值