http://noi.openjudge.cn/ch0308/2724/
描述
围棋的棋盘上有19*19条线交织成的361个交点,黑棋和白棋可以下在交点上。我们称这些交点为“目”。
一个目的上下左右四个方向,称之为“气”,如果一个目的四个方向都被某一种颜色的棋子占据,那么即使这个目上并没有棋子,仍然认为这个目被该颜色棋子占据。
如下图中,四个黑棋中心的交点,由于被黑棋包围,因此我们认为这个目属于黑棋,
黑棋拥有4+1=5目
在棋盘的边框地区,只要占据目的三个方向,就可以拥有这个目。
黑棋拥有3+1=4目
同理在棋盘的四个角上,只要占据目的两个气即可。
黑棋拥有2+1=3目
推而广之,当有多个目互相连通的时候,如果能用一种颜色把所有交点的气都包裹住,那么就拥有所有目。
黑棋拥有6+2 = 8目
请编写一个程序,计算棋盘上黑棋和白棋的目数。
输入数据中保证所有的目,不是被黑棋包裹,就是被白棋包裹。不用考虑某些棋子按照围棋规则实际上是死的,以及互相吃(打劫),双活等情况。
输入
第一行,只有一个整数N(1<=N<=100),代表棋盘的尺寸是N * N
第2~n+1行,每行n个字符,代表棋盘上的棋子颜色。
“.”代表一个没有棋子的目
“B”代表黑棋
“W”代表白棋
输出
只有一行,包含用空格分隔的两个数字,第一个数是黑棋的目数,第二个数是白棋的目数。
样例输入
4
..BW
...B
....
....
样例输出
15 1
代码
/*
4
..BW
...B
....
....
4
..BW
...B
W...
WW..
4
....
.B..
....
....
4
W..B
W..B
W..B
W..B
5
.....
.....
..B..
.....
.....
5
.B...
..B..
BB...
....W
...W.
*/
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
struct Point{
int x;
int y;
Point(int xx,int yy):x(xx),y(yy){
}
};
int n,b = 0, w = 0,xx,yy;
const int NMAX = 105;
char c[NMAX][NMAX] = {};
bool visited[NMAX][NMAX];
void BFS(int i, int j)
{
if(visited[i][j])return;
visited[i][j]=true;
int cnt = 0;
char _is = 'N';
queue <Point> q;
q.push(Point(i,j));
while (!q.empty())
{
Point t = q.front();
q.pop();
xx=t.x, yy=t.y;
if(c[xx][yy]!='.'){
if(_is=='N')
_is=c[xx][yy];
else if(_is!=c[xx][yy])
_is='X';
// printf("x:%d y:%d _is:%c\n",xx,yy,_is);
continue;
}else{
cnt++;
}
// printf("x:%d y:%d cnt:%d \n",xx,yy,cnt);
if (yy<n-1 && !visited[xx][yy+1]){
q.push(Point(xx,yy+1));
if(c[xx][yy+1]=='.')visited[xx][yy+1]=true;
}
if (xx<n-1 && !visited[xx+1][yy]){
q.push(Point(xx+1,yy));
if(c[xx+1][yy]=='.')visited[xx+1][yy]=true;
}
if (xx>0 && !visited[xx-1][yy]){
q.push(Point(xx-1,yy));
if(c[xx-1][yy]=='.')visited[xx-1][yy]=true;
}
if (yy>0 && !visited[xx][yy-1]){
q.push(Point(xx,yy-1));
if(c[xx][yy-1]=='.')visited[xx][yy-1]=true;
}
}
if (_is=='B')
b += cnt;
else if (_is=='W')
w += cnt;
// cout << b << " " << w<<endl;
return;
}
int main()
{
cin >> n;
int i,j;
for (i=0; i<n; i++)
for (j=0; j<n; j++){
cin >> c[i][j];
visited[i][j]=false;
}
for (i=0; i<n; i++)
for (j=0; j<n; j++)
if (c[i][j] == '.')
BFS(i,j);
else if (c[i][j] == 'B')
b++;
else if (c[i][j] == 'W')
w++;
cout << b << " " << w;
return 0;
}