NOI 3.8 图 2724:围棋

题目来源:http://noi.openjudge.cn/ch0308/2724/

2724:围棋

总时间限制1000ms    内存限制65536kB

描述

围棋的棋盘上有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

-----------------------------------------------------

思路

广搜求每个’.’区域的面积,如果’.’区域周边是’B’,则是黑棋的目,否则是白棋的目。

-----------------------------------------------------

代码

#include<iostream>
#include<fstream>
#include<queue>
using namespace std;

int n,b = 0, w = 0;
const int NMAX = 105;
char mat[NMAX][NMAX] = {};

void bfs(int i, int j)
{
	int cnt = 0,xx,yy;
	bool is_B = false;
	queue<int> qx,qy;
	qx.push(i);
	qy.push(j);
	cnt++;
	mat[i][j] = '*';
	while (!qx.empty())
	{
		xx = qx.front();
		yy = qy.front();
		qx.pop();
		qy.pop();
		if (xx>0 && mat[xx-1][yy]=='.')
		{
			mat[xx-1][yy] = '*';
			cnt++;
			qx.push(xx-1);
			qy.push(yy);
		}
		else if (xx>0 && mat[xx-1][yy] == 'B')
		{
			is_B = true;
		}
		if (yy>0 && mat[xx][yy-1]=='.')
		{
			mat[xx][yy-1] = '*';
			cnt++;
			qx.push(xx);
			qy.push(yy-1);
		}
		else if (yy>0 && mat[xx][yy-1] == 'B')
		{
			is_B = true;
		}
		if (xx<n-1 && mat[xx+1][yy]=='.')
		{
			mat[xx+1][yy] = '*';
			cnt++;
			qx.push(xx+1);
			qy.push(yy);
		}
		else if (xx<n-1 && mat[xx+1][yy]=='B')
		{
			is_B = true;
		}
		if (yy<n-1 && mat[xx][yy+1]=='.')
		{
			mat[xx][yy+1] = '*';
			cnt++;
			qx.push(xx);
			qy.push(yy+1);
		}
		else if (yy<n-1 && mat[xx][yy+1] == 'B')
		{
			is_B = true;
		}
	}
	if (is_B)
	{
		b += cnt;
	}
	else
	{
		w += cnt;
	}
	return;
}


int main()
{
#ifndef ONLINE_JUDGE
	ifstream fin ("0308_2724.txt");
	fin >> n;
	int i,j;
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			fin >> mat[i][j];
		}
	}
	fin.close();
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			if (mat[i][j] == '.')
			{
				bfs(i,j);
			}
			else if (mat[i][j] == 'B')
			{
				b++;
			}
			else if (mat[i][j] == 'W')
			{
				w++;
			}
		}
	}
	cout << b << " " << w;
	return 0;
#endif
#ifdef ONLINE_JUDGE
	cin >> n;
	int i,j;
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			cin >> mat[i][j];
		}
	}
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
		{
			if (mat[i][j] == '.')
			{
				bfs(i,j);
			}
			else if (mat[i][j] == 'B')
			{
				b++;
			}
			else if (mat[i][j] == 'W')
			{
				w++;
			}
		}
	}
	cout << b << " " << w;
	return 0;
#endif
}

猜你喜欢

转载自blog.csdn.net/da_kao_la/article/details/80721406
3.8
今日推荐