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();
}

Download