PBCWATER - Tính toán lượng nước
Tác giả: skyvn97
Ngôn ngữ: C++
#include<stdio.h>
#define MAX 111
int m,n;
int a[MAX][MAX];
int c[MAX][MAX];
int hm,s;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void init(void)
{
int i,j;
scanf("%d",&m);
scanf("%d",&n);
hm=-1;
for (i=1;i<=m;i=i+1)
for (j=1;j<=n;j=j+1)
{
scanf("%d",&a[i][j]);
if (hm<a[i][j]) hm=a[i][j];
}
for (i=0;i<=m+1;i=i+1)
{
c[i][0]=2;
c[i][n+1]=2;
}
for (i=0;i<=n+1;i=i+1)
{
c[0][i]=2;
c[m+1][i]=2;
}
s=0;
}
void dfs(int x,int y)
{
if (c[x][y]>0) return;
int i,j;
c[x][y]=1;
for (i=0;i<=3;i=i+1)
if (c[x+dx[i]][y+dy[i]]==0) dfs(x+dx[i],y+dy[i]);
}
void process(void)
{
int i,j,k;
for (i=1;i<=hm;i=i+1)
{
for (j=1;j<=m;j=j+1)
for (k=1;k<=n;k=k+1)
{
if (a[j][k]<i) c[j][k]=0;
else c[j][k]=1;
}
for (j=1;j<=m;j=j+1)
{
if (c[j][1]==0) dfs(j,1);
if (c[j][n]==0) dfs(j,n);
}
for (j=1;j<=n;j=j+1)
{
if (c[1][j]==0) dfs(1,j);
if (c[m][j]==0) dfs(m,j);
}
for (j=2;j<m;j=j+1)
for (k=2;k<n;k=k+1)
if (c[j][k]==0) s=s+1;
}
printf("%d",s);
}
int main(void)
{
init();
process();
}