SRM326 D2H PoolFiller

TopCoder Statistics - Problem Statement

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2010, TopCoder, Inc. All rights reserved.

プールのそれぞれの高さが与えられる.そのプールに貯めることができる水の量を返す.


回りが自分の所より高いブロックで囲われている場合にそこには水がたまる.探索するときに,プールから出てしまえばその時点で囲われていないので,一回のdfsで埋めながら探索するわけではなくて,まず囲まれているかどうかを確認した後に1ブロックずつ埋めていくことにした

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define INF 1<<30
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int v[55][55], cnt, n, m;
bool flag, used[55][55];

int dy[4] = {1, 0, -1, 0};
int dx[4] = {0, 1, 0, -1};

void dfs(int i, int j, int val) {
  if(used[i][j]) return;

  cnt++;
  used[i][j] = true;

  rep(k, 4) {
      int y = i + dy[k];
      int x = j + dx[k];

      if(0 <= y && y < n && 0 <= x && x < m) {
          if(v[y][x] == val) {
              dfs(y, x, val);
          } else if(v[y][x] > val) {
              continue;
          } else {
              flag = false;
          }
      } else {
          flag = false;
      }
  }
}

void dfs2(int i, int j, int val) {
  if(v[i][j] == val) {
      v[i][j]++;

      rep(k, 4) {
          int y = i + dy[k];
          int x = j + dx[k];

          dfs2(y, x, val);
      }
  }
}

class PoolFiller {

    public:

    int getCapacity(vector <string> layout) {
      n = layout.size();
      m = layout[0].size();

      memset(v, 0, sizeof(v));

      rep(i, n) {
          rep(j, m) {
              int t = int(layout[i][j] - '0');
              v[i][j] = t;
          }
      }

      int ans = 0;
      rep(i, n) {
          rep(j, m) {
              flag = true;

              while(flag) {
                  cnt = 0;
                  memset(used, 0, sizeof(used));

                  dfs(i, j, v[i][j]);

                  if(flag) {
                      ans += cnt;
                      dfs2(i, j, v[i][j]);
                  }
              }
          }
      }

      return ans;
    }
};
Nov 18th, 2016