hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷·二
没有复杂算法,就是麻烦,写起来细节比较多,比较考验细心,一次AC好开心。
代码:
1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 #include <cstdlib> 5 6 using namespace std; 7 8 #define SIZE 400 9 10 int N, M; 11 int map[SIZE][SIZE]; 12 int res[SIZE][SIZE]; 13 14 vector<pair<int, int> > unknown_neighbors(int i, int j) { 15 vector<pair<int, int> > nbs; 16 17 for (int ii = -1; ii < 2; ii++) 18 for (int jj = -1; jj < 2; jj++) { 19 int r = ii + i; 20 int c = jj + j; 21 if (r >= 0 && r < N && c >= 0 && c < M && (r != i || c != j) && map[r][c] < 0) 22 nbs.push_back(pair<int, int>(r, c)); 23 } 24 25 return nbs; 26 } 27 28 vector<pair<int, int> > known_counterparts(int i, int j) { 29 vector<pair<int, int> > cps; 30 31 for (int ii = -2; ii < 3; ii++) { 32 for (int jj = -2; jj < 3; jj++) { 33 int r = ii + i; 34 int c = jj + j; 35 if (r >= 0 && r < N && c >= 0 && c < M && (r != i || c != j) && map[r][c] >= 0) 36 cps.push_back(pair<int, int>(r, c)); 37 } 38 } 39 40 return cps; 41 } 42 43 vector<pair<int, int> > differ(vector<pair<int, int> > &a, vector<pair<int, int> > &b) { 44 vector<pair<int, int> > diff; 45 int count = 0; 46 47 for (auto pa : a) { 48 bool found = false; 49 for (auto pb : b) { 50 if (pb == pa) { 51 found = true; 52 count++; 53 break; 54 } 55 } 56 if (!found) 57 diff.push_back(pa); 58 } 59 60 if (count < b.size()) 61 diff.clear(); 62 63 return diff; 64 } 65 66 void merge_pos(int i, int j, int v) { 67 if (res[i][j] == -1 || res[i][j] == v) 68 res[i][j] = v; 69 else 70 res[i][j] = -2; 71 } 72 73 void solve() { 74 for (int i = 0; i < N; i++) 75 for (int j = 0; j < M; j++) { 76 if (map[i][j] == 0) { 77 vector<pair<int, int> > nbs = unknown_neighbors(i, j); 78 for (auto p : nbs) 79 merge_pos(p.first, p.second, 0); 80 } 81 else if (map[i][j] > 0) { 82 vector<pair<int, int> > nbs = unknown_neighbors(i, j); 83 if (nbs.size() == map[i][j]) { 84 for (auto p : nbs) 85 merge_pos(p.first, p.second, 1); 86 continue; 87 } 88 89 vector<pair<int, int> > cps = known_counterparts(i, j); 90 for (auto p : cps) { 91 vector<pair<int, int> > cp_nbs = unknown_neighbors(p.first, p.second); 92 if (nbs.size() <= cp_nbs.size() || map[i][j] <= map[p.first][p.second]) 93 continue; 94 vector<pair<int, int> > diff = differ(nbs, cp_nbs); 95 if ((int) (nbs.size() - cp_nbs.size()) == map[i][j] - map[p.first][p.second] && !diff.empty()) 96 for (auto dp : diff) 97 merge_pos(dp.first, dp.second, 1); 98 } 99 } 100 } 101 } 102 103 int main() { 104 int n; 105 106 cin >> n; 107 while (n--) { 108 cin >> N >> M; 109 for (int i = 0; i < N; i++) 110 for (int j = 0; j < M; j++) 111 cin >> map[i][j]; 112 memset(res, -1, SIZE * SIZE * sizeof(int)); 113 114 solve(); 115 116 int mine = 0; 117 int not_mine = 0; 118 119 for (int i = 0; i < N; i++) 120 for (int j = 0; j < M; j++) { 121 mine += (res[i][j] == 1 ? 1 : 0); 122 not_mine += (res[i][j] == 0 ? 1 : 0); 123 } 124 125 cout << mine << " " << not_mine << endl; 126 } 127 128 return 0; 129 }