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のプール数と同じタイプです.(ほぼ同じ問題)検索.
二値画像は白黒の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;
}