区域统计

区域统计问题—问题 1
n*n 的方块包有黒色和白色单元,它们按照一定的方式排列。向題是如何计
算出白色区域的数目和每个区域中白色单元的数目。例如,规则的 8X8 的棋盘含
有 32 个白色区域。每个区域含有一个白色单元。图(a)中含有 10 个白色区域,
其中的 2 个区域各包含 10 个单元,另外 8 个区域各包含 2 个单元。图(b)中的
方块含有 5 个白色区域,分别包含 1、3、21、10 和 2 个白色单元。

(a)
在这里插入图片描述
(b)
在这里插入图片描述

对于给定的 n×n 方块,编写一个程序,输出白色区域的数目以及每个区域
中白色单元的数目。使用(n+2)×(n+2)的数组,其中的单元进行做了适当标记。
额外的两行和两列组成了围绕输入方块的黑色单元边框,以简化实现过程。例如,
图(a)所示的方块保存为图(b)所示的方块形式。
逐行遍历方块,遇到第一个没有访问过的单元,就调用处理一个区域的函数。
这个函数的奥妙在于对每个没有访问的白色单元使用四次递归调用,并对它标明
一个特殊的“已访问(已计数)标记。

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

char room[200][200];

int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};

int c[100005];
int b=0;

void search3(int i,int j){
	if(room[i][j]=='w'){
		b++;
		room[i][j]='g';
		for(int k=0;k<4;k++){
			search3(i+dx[k],j+dy[k]);
		}
	}
	else if(room[i][j]=='b'||room[i][j]=='g'){
		return ;
	}
}


int main(){
	int n;
	char s[405];
	gets(s);
//	puts(s);
	int len=strlen(s);
//	cout<<len;
	n=(len+1)/2;
	
	
	for(int i=0,j=0;i<len;i++){
		if(s[i]=='b'){
			room[0][j];
			j++;
		}
	}
	
	for(int i=1;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>room[i][j];
		}
	}
	
//	for(int i=1;i<n;i++){
//		for(int j=0;j<n;j++){
//			cout<<room[i][j]<<' ';
//		}
//		cout<<endl;
//	}
	int a=0;
	for(int i=1;i<n;i++){
		for(int j=1;j<n;j++){
			if(room[i][j]=='w'){
				a++;
				b=0;
				search3(i,j);
				c[a-1]=b;
			}
		}
	}
	
	cout<<endl;
	cout<<"======================"<<endl;
	cout<<endl<<"这个区域有"<<a<<"个白色区域"<<endl;
	sort(c,c+a);
	cout<<"每个白色区域具有的白色单元分别为"<<endl; 
	for(int i=0;i<a;i++){
		cout<<c[i]<<' ';
	}
	
	return 0;
}

/*
	Name: 区域统计3 
	Author: Joker.K
	Date: 24/02/20 10:31
*/

运行结果
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值