• Source
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. int m, n;
    5. int H[102][102];
    6. void readInfo ()
    7. {
    8. cin>>m>>n;
    9. for (int i=1; i<=m; i++)
    10. {
    11. for (int j=1; j<=n; j++)
    12. {
    13. cin>>H[i][j];
    14. }
    15. }
    16. }
    17.  
    18. int H_Sp [102][102];
    19. int Hmax;
    20. int Sp_floor ()
    21. {
    22. Hmax=0;
    23. for (int i=1; i<=m; i++)
    24. {
    25. for (int j=1; j<=n; j++)
    26. {
    27. if (H[i][j]>Hmax) Hmax=H[i][j];
    28. }
    29. }
    30.  
    31. if (Hmax==0) return -1;
    32. for (int i=1; i<=m; i++)
    33. {
    34. for (int j=1; j<=n; j++)
    35. {
    36. if (H[i][j]<1)
    37. {
    38. H_Sp[i][j]=0;
    39. if (H[i][j]!=0) H[i][j]--;
    40. }
    41. else
    42. {
    43. H_Sp[i][j]=1;
    44. if (H[i][j]!=0) H[i][j]--;
    45. }
    46. }
    47. }
    48. return 1;
    49. }
    50.  
    51. int Xxq[]={-1, +0, +1, +0};
    52. int Yxq[]={+0, +1, +0, -1};
    53. void loang_broder (int i, int j)
    54. {
    55. H_Sp[i][j]=1;
    56. for (int k=0; k<4; k++)
    57. {
    58. int X=j+Xxq[k];
    59. int Y=i+Yxq[k];
    60. if (Y>=1 && Y<=m && X>=1 && X<=n && H_Sp[Y][X]==0)
    61. {
    62. loang_broder (Y, X);
    63. }
    64. }
    65. }
    66.  
    67. int main ()
    68. {
    69. readInfo ();
    70. int dem=0;
    71. while (1)
    72. {
    73. if (Sp_floor ()==-1) break;
    74. //Loang_broder
    75. for (int i=1; i<=m; i++)
    76. {
    77. for (int j=1; j<=n; j++)
    78. {
    79. if (i==1 || i==m || j==1 || j==n)
    80. {
    81. if (H_Sp[i][j]==0)
    82. {
    83. loang_broder (i, j);
    84. }
    85. }
    86. }
    87. }
    88. //Cout water
    89. for (int i=1; i<=m; i++)
    90. {
    91. for (int j=1; j<=n; j++)
    92. {
    93. if (H_Sp[i][j]==0) dem++;
    94. }
    95. }
    96. }
    97. cout<<dem;
    98. return 0;
    99. }