题目描述
编程计算由"1"围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中"0"点的数目。如图所示,在10*10的二维数组中,"1"围住了15个点,因此面积为15。
提示:queue
输入
测试次数t
每组测试数据格式为:
数组大小m,n
一个由0和1组成的m*n的二维数组
输出
对每个二维数组,输出符号"1"围住的"0"的个数,即围成的面积。假设一定有1组成的闭合曲线,但不唯一。
输入样例1 | 输出样例1 |
2 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 5 8 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 | 15\n 5\n |
#include<iostream>
using namespace std;
//洪水法
void hongshui(int vi,int vj,int len_i,int len_j,int **m){
//
if(vi-1>=0&&m[vi-1][vj]==0){
m[vi-1][vj]=1;
hongshui(vi-1,vj,len_i,len_j,m);
}
//
if(vi+1<len_i&&m[vi+1][vj]==0){
m[vi+1][vj]=1;
hongshui(vi+1,vj,len_i,len_j,m);
}
//
if(vj-1>=0&&m[vi][vj-1]==0){
m[vi][vj-1]=1;
hongshui(vi,vj-1,len_i,len_j,m);
}
//
if(vj+1<len_j&&m[vi][vj+1]==0){
m[vi][vj+1]=1;
hongshui(vi,vj+1,len_i,len_j,m);
}
}
int main(){
int t;
cin>>t;
while(t--){
int va,vb;
cin>>va>>vb;
int **matrix = new int *[va];
for(int i = 0 ; i < va ; i++ ){
matrix[i] = new int [vb];
for(int j = 0 ; j < vb ; j++ ){
cin>>matrix[i][j];
}
}
//枚举法
int sum=0;
for(int i = 0 ; i < va ; i++){
for(int j = 0 ; j < vb ; j++ ){
if((i==0||j==0||i==va-1||j==vb-1)&&matrix[i][j]==0){
hongshui(i,j,va,vb,matrix);
matrix[i][j]=1;
}
}
}
for(int i = 0 ; i < va ; i++ ){
for(int j = 0 ; j < vb ; j++ ){
if(matrix[i][j]==0)
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}
第一次觉得打代码这么有意思捏。要是oj的题目设计能多点投机取巧,少点空间复杂度该多好哈哈哈/乐