noi.openjudge 2724:围棋

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;
}
基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值