FZU 1082【最大ブラックゾーン】

2212 ワード

Description
二値画像は白黒の2つの画素からなる矩形ドットマトリクスであり、画像認識の1つの動作は画像中の最大黒領域の面積を求めることである.2値画像のこの操作を完了するプログラムを設計してください.黒領域は黒画素からなり、1つの黒領域の各画素は少なくともその領域の他の画素に隣接し、1つの画素が上、下、左、右の画素にのみ隣接することを規定する.2つの異なる黒領域には隣接する画素はありません.1つの黒い領域の面積は、その含まれる画素の個数である.
Input
入力は複数のテスト例で構成されています.各試験例の第1行は2つの整数nとm、(1<=n,m<=100)を含み、それぞれ2値画像の行数と列数を表し、後にn行が続き、各行はm個の整数0または1を含み、そのうちi行目は画像のi行目のm個の画素、0は白画素、1は黒画素を表す.同じ行の隣接する2つの整数間は1つのスペースで区切られ、2つの試験例間は1つの空行で区切られ、最後の試験例の後は1つの空行で区切られ、再接続された1行は2つの整数0を含み、入力の終了を示す.
Output
各試験例は、対応する画像の最大黒領域の面積を表す整数を含む1行の出力に対応する.
Sample Input
5 6
0 1 1 0 0 1
1 1 0 1 0 1
0 1 0 0 1 0
0 0 0 1 1 1
1 0 1 1 1 0
0 0
Sample Output
7
NYOJのプール数と同じタイプです.(ほぼ同じ問題)検索.
#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b
#define Max 110
int m,n;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int map[Max][Max];
int vis[Max][Max];
int count;
int sum=0,maxn;
void dfs(int x, int y)
{
    int nx,ny;
    for(int d=0; d<4; d++)
    {
        nx = x + dir[d][0];
        ny = y + dir[d][1];
        if(!vis[nx][ny] && map[nx][ny] && nx >= 0 && nx <= m && ny>=0 && ny <= n)
        {
            vis[nx][ny] = 1;
            sum++;
            dfs(nx,ny);
        }
    }
       maxn=max(sum,maxn);
}

int main()
{
    int t;
    int i,j;
    while( scanf("%d %d",&m,&n)&&m!=0&&n!=0)
    {
        maxn=0;
        for(i=0; i<=m; i++)
            map[i][m+1]=map[i][0]=0;
        for(j=0; j<=n; j++)
            map[n+1][j]=map[0][j]=0;
        for(i=1; i<=m; i++)
        {
            for(j=1; j<=n; j++)
            {
                scanf("%d",&map[i][j]);
            }
        }
        memset(vis, 0, sizeof(vis));
        count=0;
        for(i=1; i<=m; i++)
        {
            for(j=1; j<=n; j++)
            {
                if(!vis[i][j] && map[i][j])
                {
                    sum=1;
                    vis[i][j]=1;
                    dfs(i,j);
                }
            }
        }
        printf("%d
",maxn); } return 0; }