Problem A: 面积(area)

Problem A: 面积(area)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 546  Solved: 179
[Submit] [Status] [Web Board] [Creator:]

Description

编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在 10*10 的二维数组中,有“*”围住了 15 个点,因此面积为 15。上下左右4个方向



Sample Input Copy

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

Sample Output Copy

15

HINT

#include<bits/stdc++.h>
using namespace std;
int a[11][11],b=10,c,d,g[145],h[145],dx[5]={0,-1,0,0,1},dy[5]={0,0,1,-1,0},k,l,m=0,q[100001];
int head=1,tail=1;
void bfs(int x,int y)
{
    
    g[1]=x;
    h[1]=y;
    //q[1]=0;
    while(head<=tail)
    {
        for(int c=1;c<=4;c++)
        {
            int k=g[head]+dx[c];
            int l=h[head]+dy[c];
            if(k>=1 && k<=b && l>=1 && l<=b && a[k][l]==0)
            {
            tail++;
                a[k][l]=1;
                g[tail]=k;
                h[tail]=l;
                //q[tail]=q[head]+1;
            }
        }
        head++;
    }
}
int main()
{
int i,j,s=0;
     for(i=1;i<=10;i++)
        for(j=1;j<=10;j++)cin>>a[i][j];
    for(i=1;i<=10;i++)
    {
        if(a[i][10]==0)bfs(i,10);
        if(a[10][i]==0)bfs(10,i);
        if(a[i][1]==0)bfs(i,1);
        if(a[1][i]==0)bfs(1,i);
    }       
    for(i=1;i<=10;i++)
        for(j=1;j<=10;j++)
            if(a[i][j]==0) s++;
    cout<<s;
    return 0; 
}