时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10×10的二维数组中,有“*”围住了15个点,因此面积为15。
【输入】
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
【输出样例】
15
#include <iostream>
#include <cstring>
using namespace std;
int map[12][12];
int xy_[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int deq[600][2];
bool book[12][12];
void bfs(int i,int j){
int top,tail,x,y,xx,yy;
top=tail=0;
memset(deq,0,sizeof(deq));
deq[tail][0]=i;deq[tail][1]=j;tail++;
while(tail>top){
x=deq[top][0];y=deq[top][1];book[x][y]=true;
for(int k=0;k<4;k++){
xx=x+xy_[k][0];yy=y+xy_[k][1];
if(xx>=1&&xx<=10&&yy>=1&&yy<=10&&map[xx][yy]==0&&!book[xx][yy]){
deq[tail][0]=xx;deq[tail][1]=yy;tail++;book[xx][yy]=true;
}
}
map[x][y]=1;top++;
}
}
int sun_(){
int sum=0;
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
if(map[i][j]==0&&!book[i][j]) sum++;
return sum;
}
int main(int argc, char *argv[])
{
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
cin>>map[i][j];
for(int i=1;i<=10;i++){
if(map[1][i]==0)bfs(1,i);
if(map[10][i]==0)bfs(10,i);
if(map[i][1]==0)bfs(i,1);
if(map[i][10]==0)bfs(i,10);
}
cout<<sun_()<<endl;
return 0;
}