区域统计问题—问题 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
*/
运行结果