|
| 1 | +#include <iostream> |
| 2 | +#include <sstream> |
| 3 | +#include <vector> |
| 4 | +#include <algorithm> |
| 5 | +#include <set> |
| 6 | +#include <map> |
| 7 | +#include <queue> |
| 8 | +#include <cstring> |
| 9 | +#include <climits> |
| 10 | +using namespace std; |
| 11 | +typedef pair<int,int> pi; |
| 12 | +typedef vector<int> vi; |
| 13 | +typedef vector<vi> vvi; |
| 14 | +typedef vector<string> vs; |
| 15 | +typedef vector<vs> vvs; |
| 16 | +typedef set<pi> sp; |
| 17 | +vs A; |
| 18 | +int cnt; |
| 19 | +int n, m; |
| 20 | +int B[51][51]; |
| 21 | +int I[8] = {1, -1, 1, -1, 1, 0, -1, 0}; |
| 22 | +int J[8] = {1, -1, -1, 1, 0, 1, 0, -1}; |
| 23 | + |
| 24 | + |
| 25 | +class TopographicalImage { |
| 26 | + |
| 27 | + public: |
| 28 | + void dfs(int i, int j){ |
| 29 | + cnt++; |
| 30 | + B[i][j] = 1; |
| 31 | + for(int a = 0; a < 8; a++){ |
| 32 | + int ii = i+I[a], jj = j+J[a]; |
| 33 | + if(ii >= 0 && jj >= 0 && ii < n && jj < m) |
| 34 | + if(A[ii][jj] <= A[i][j] && !B[ii][jj]) dfs(ii, jj); |
| 35 | + } |
| 36 | + } |
| 37 | + |
| 38 | + vi calcPeakAreas(vs AA) |
| 39 | + { |
| 40 | + A = AA; |
| 41 | + n = A.size(); m = A[0].size(); |
| 42 | + cnt = 0; |
| 43 | + for(int i = 0; i <= 50; i++) |
| 44 | + for(int j = 0; j <= 50; j++) B[i][j] = 0; |
| 45 | + |
| 46 | + int sum = 0; |
| 47 | + vi ret; |
| 48 | + while(sum < n*m){ |
| 49 | + int x = -1, y = -1, maxv = 0; |
| 50 | + for(int i = 0; i < n; i++) |
| 51 | + for(int j = 0; j < m; j++) |
| 52 | + if(B[i][j] == 0 && A[i][j] > maxv){ |
| 53 | + maxv = A[i][j]; |
| 54 | + x = i; y = j; |
| 55 | + } |
| 56 | + if(x != -1){ |
| 57 | + cnt = 0; |
| 58 | + dfs(x, y); |
| 59 | + ret.push_back(cnt); |
| 60 | + sum += cnt; |
| 61 | + } |
| 62 | + } |
| 63 | + return ret; |
| 64 | + } |
| 65 | + |
| 66 | +// BEGIN CUT HERE |
| 67 | + public: |
| 68 | + void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); } |
| 69 | + private: |
| 70 | + template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); } |
| 71 | + void verify_case(int Case, const vector <int> &Expected, const vector <int> &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: " << print_array(Expected) << endl; cerr << "\tReceived: " << print_array(Received) << endl; } } |
| 72 | + void test_case_0() { string Arr0[] = { |
| 73 | +"............", |
| 74 | +"....i..i....", |
| 75 | +"....i..i....", |
| 76 | +".o..i..i..o.", |
| 77 | +".o........o.", |
| 78 | +"..oooooooo..", |
| 79 | +"............" |
| 80 | +}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = { 78, 3, 3 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(0, Arg1, calcPeakAreas(Arg0)); } |
| 81 | + void test_case_1() { string Arr0[] = { |
| 82 | +"............", |
| 83 | +"....i..i....", |
| 84 | +"....i..i....", |
| 85 | +".S..i..i..Y.", |
| 86 | +".M........E.", |
| 87 | +"..ILEYSMIL..", |
| 88 | +"............" |
| 89 | +}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = { 69, 3, 2, 5, 3, 1, 1 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(1, Arg1, calcPeakAreas(Arg0)); } |
| 90 | + void test_case_2() { string Arr0[] = { |
| 91 | +"zzzzzzzzzzzzz", |
| 92 | +"z...........z", |
| 93 | +"z...c.b.c...z", |
| 94 | +"z....bab.b..z", |
| 95 | +"z...c.b.c...z", |
| 96 | +"z...........z", |
| 97 | +"zzzzzzzzzzzzz" |
| 98 | +}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = { 81, 6, 2, 1, 1 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(2, Arg1, calcPeakAreas(Arg0)); } |
| 99 | + void test_case_3() { string Arr0[] = {"!"}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = { 1 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(3, Arg1, calcPeakAreas(Arg0)); } |
| 100 | + void test_case_4() { string Arr0[] = { |
| 101 | +"AAAAAAABBBBCCCDEFGHHIIJIIHGFEDDCCCBBBBBBBBBBAAAAAA", |
| 102 | +"AAAAABBBBBCCDDEEFGHIJJJJIIHGFEDDCCCCCCCCCBBBBBAAAA", |
| 103 | +"AAAABBBBCCCDDEEFGHIIJJJJJIHGFEDDDDDDDDDCCCCBBBBAAA", |
| 104 | +"AAABBBBCCDDEEFFGHHIJJJJJJIHGFEEDDDDDEEDDDDCCBBBBAA", |
| 105 | +"AABBBCCDDEEFFGGHHIIJJJJJIHHGFEEEEEEEFFFEEDDCCBBBAA", |
| 106 | +"BBBBCCDDEFFGHHHIIIIJJJIIIHGFFEEEEFFGGGGGFEEDCCBBBA", |
| 107 | +"BBBCCDEEFGHIIIJJJJIIIIIHHGGFFEEFFGGHHHHHGGFEDCCBBB", |
| 108 | +"BBCCDEEGHIJJKKKKJJJIIHHGGFFEEEEFGGHIIJJIIHGFEDCCBB", |
| 109 | +"CCCDEEFHIJKLMMMLKKJIHHGGFFEEEEFFGHIJJKKJJIHGFEDCBB", |
| 110 | +"CDDEEFHIJLMNNNNMLKJIHGFFEEEDEEFFGIJKKLLLKJIHFEDCCB", |
| 111 | +"DDEFFGIJLMNOPPONMLJIHGFEEDDDDEFGHIJKLMMMLKJIGFEDCB", |
| 112 | +"EEFFGHIKMNOQQQPONLKIHFEEDDDDDEFGHIKLMMNMMLKIHGEDCC", |
| 113 | +"FFGGHIJLMOPQRRQPNMKIGFEDDCCDDEFGHIKLMNNNNMLJIGFEDC", |
| 114 | +"GHHHIJKLNOQRRRQPOMKIGFEDDCCDDEFGHIKLMNNNNMLKIHFEDC", |
| 115 | +"HIIIJJKLNOPQRRQPNLKIGFEDDCCDDEFGHJKLMNOONNMKJHGFDC", |
| 116 | +"IJJJJJKLMOPQQQPONLJHGFEDDDDDEEFGIJKLMNOONNMLJIGFED", |
| 117 | +"JJJJJKKLMNOOPPONMKJHGFEDDDDEEFGHIJKLMNNONNMLJIGFED", |
| 118 | +"JKKJJJKKLMMNNNNMLJIHFFEEEEEFGGHIJKLMMNNNNMMKJIGFED", |
| 119 | +"KKKJJJJJKKLLMLLKJIHGFFEEEFFGHIJKKLMMNNNNNMLKJHGFED", |
| 120 | +"JJJJIIIIIJJJKKJJIIHGFFFFFGHIJKLMMNNNNNNMMLKJIHGEDC", |
| 121 | +"JJJIIHHHHHHIIIIIHHGGGGGGHIJKLMNOOOOONNMMLKJIHGFEDC", |
| 122 | +"IIIHHGGGGGGGGHHHGGGGGGHIIJLMNOPQQQQPONMLKJIHGFEDDC", |
| 123 | +"HHHGGFFFFFFFFFGGGGGGHHIJKMNOQRSSSSRQPNMLKIHGFFEDCC", |
| 124 | +"GGGFFEEEEEEEEFFFGGGHIJKLMOPRSTUUUTSRPNMKJHGFFEDCCB", |
| 125 | +"FFFEEEEDDDDEEEEFGGHIJKLNOQRTUVWWWVTRPNLJIHFEEDCCBB", |
| 126 | +"EEEEDDDDDDDDEEEFGHIJKLNOQRTVWXYYXWUSPNLJHGFEDCCBBB", |
| 127 | +"DDDDDDDDDDDEEEFFGHIKLNOQRTVWXYZYYWURPMKIGFEDCCBBBB", |
| 128 | +"CDDDDDDEEEEEEFFGHIJKMOPRSUWXYZZZXWTROMJHGEDCCBBBBA", |
| 129 | +"CCDDDEEEFFFFFGGHHJKLNOQRTVWXYZZYXVTQNLIGFEDCBBBAAA", |
| 130 | +"CCDDEFFGGGGHHHHIIJKMNPQSTVWXYYYXVURPMKIGEDCBBBAAAA", |
| 131 | +"CDDEFGGHIIIIIIIJJKLMOPQSTUVWWXWVUSQNLJHFECCBBBAAAA", |
| 132 | +"CDEFGHIJKKKKKKKKKLMNOPQRSTUVVVUTSQOMJHGEDCBBBAAAAA", |
| 133 | +"CDEGHIKLMMMMMMLLLMMNOPQRSSTTTTSRQOMKIGFDCCBBAAAAAA", |
| 134 | +"DEFGIKLMNOOOONNMMMNNOPQQRRRRRRQPNMKIHFEDCBBBAAAAAA", |
| 135 | +"DEGHJLMOPQQQPPOONNNOOPPPQQQPPONMLKIHFEDCBBBAAAAAAA", |
| 136 | +"DEGIKMNPQRRRRQPOOOOOOOPPPOOONMLKJIHFEDCCBBAAAAAAAA", |
| 137 | +"DFGIKMOQRSSSRRQPOOOOOOOOONMMLKJIHGFEDCCBBBAAAAAAAA", |
| 138 | +"DFGIKMOQRSSSRRQPOOOOONNNMMLKJIIHGFEDCCBBBAAAAAAAAA", |
| 139 | +"DEGIJLNPQRRRRQPOONNNNNMMLLKJIHGFEEDCCBBBAAAAAAAAAA", |
| 140 | +"DEFHJKMOPQQQQPOONNMMMMLLKJIHGGFEDDCCBBBAAAAAAAAAAA", |
| 141 | +"CDFGIJLMNOOOONNMMLLLLLKKJIHGFEEDCCCBBBAAAAAAAAAAAA", |
| 142 | +"CDEFGIJKLMMMMMLLKKKKKJJIIHGFEDDCCBBBBAAAAAAAAAAAAA", |
| 143 | +"CCDEFGHIJKKKKKJJJIIIIIHHGGFEDDCCBBBBAAAAAAAAAAAAAA", |
| 144 | +"BCCDEFGHHIIIIIHHHHHHHGGGFFEDDCCBBBAAAAAAAAAAAAAAAA", |
| 145 | +"BBCCDEEFFGGGGGGFFFFFFFFEEDDCCCBBBAAAAAAAAAAAAAAAAA", |
| 146 | +"BBBCCDDEEEEEEEEEEEEEEEEDDDCCBBBBAAAAAAAAAAAAAAAAAA", |
| 147 | +"ABBBCCCCDDDDDDDDDDDDDDDCCCCBBBBAAAAAAAAAAAAAAAAAAA", |
| 148 | +"AABBBBBCCCCCCCCCCCCCCCCCCBBBBBAAAAAAAAAAAAAAAAAAAA", |
| 149 | +"AAABBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAA", |
| 150 | +"AAAAAABBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAA" |
| 151 | +}; vector <string> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = { 1918, 65, 483, 5, 5, 24 }; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); verify_case(4, Arg1, calcPeakAreas(Arg0)); } |
| 152 | + |
| 153 | +// END CUT HERE |
| 154 | + |
| 155 | + }; |
| 156 | + |
| 157 | +// BEGIN CUT HERE |
| 158 | +int main(){ |
| 159 | + |
| 160 | + TopographicalImage ___test; |
| 161 | + ___test.run_test(-1); |
| 162 | + |
| 163 | +} |
| 164 | +// END CUT HERE |
0 commit comments