// 矩形一個 AXB ,查詢有 n 個, 每個高度為h 的最大面積,
// 如範例中 1的有7個、2的有5個、3的有6個、4的為0個 {1個的印0}
#include <iostream>
using namespace std;
int di[]={-1,1,0,0};
int dj[]={0,0,-1,1};
int a[30][30];
int A,B , cnt;
void dfs(int i, int j, int h)
{
a[i][j]=0; ++cnt; // 設為0表示已走過 計數 +1
for(int d=0; d<4; ++d) //上下左右
{
int ni = i+di[d] , nj = j+dj[d];
if(ni<0 || ni>=A || nj<0 || nj>=B ) continue;
if( a[ni][nj]==h) dfs(ni,nj,h);
}
return;
}
int main()
{
int i,j,h,n;
int hcnt[10];
cin >> A >> B;
for(h=0; h<10; ++h) hcnt[h] = 0; // 0~9
for(i=0; i<A; ++i)
for(j=0; j<B; ++j)
cin >> a[i][j];
// 建表 高度 h 的最大面積 放至 hcnt[h]
for(i=0;i<A;++i)
for(j=0; j<B; ++j)
if(a[i][j] != 0 ) '非0:某一高度 h, 以dfs求 h 面積
{
h = a[i][j];
cnt=0;
dfs(i,j,a[i][j]);
if(cnt>hcnt[h]) hcnt[h]=cnt; '這次h的面積比 前1個大存入表中
}
// n 個查詢 , 高度 h 的最大面積?
cin >> n;
while(n--)
{
cin >> h;
cout << (hcnt[h]>=2 ? hcnt[h] : 0 ) << endl; // <2的印 0
}
return 0;
}
/* 輸入範例
5 7
1 1 1 4 1 1 1
1 2 2 3 1 3 1
1 2 3 3 3 1 1
2 2 3 3 2 2 2
4 3 2 2 1 2 2
4
1
2
3
4
------輸出範例
7
5
6
0
*/
0 意見:
張貼留言