hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷・二 - 李舜阳 - 博客园


hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷・二 - 李舜阳 - 博客园
http://hihocoder.com/problemset/problem/1119
给出一张N*M的地图,其中的某些格子已经被探明,探明的格子中都标有一个数字,表明与它相邻的8个格子里的地雷数量,而没有探明的格子里可能会有一些地雷。
现在小Ho仅仅知道如下三条规则:
1.如果某一个被探明的格子里所标的数字为0,那么它相邻的8个格子里的未探明格子被认作是一定不是地雷的格子
2.如果某一个被探明的格子里所标的数字为K,且它相邻的8个格子里正好有K个没有探明的格子的话,则这K个没有探明的格子被认作是一定是地雷的格子
3.如果某两个探明了的格子A和B,他们中标明的数字分别为P_A和P_B,且他们周围8个格子中没有探明的格子组成的集合分别为S_A和S_B,如果S_A包含S_B,且|S_A|-|S_B|=P_A-P_B,那么S_A-S_B中的所有格子,被认作是一定是地雷的格子
而问题是:仅仅利用这三条规则,小Ho到底能判断出哪些没有探明的格子里一定是地雷,而哪些没有探明的格子里一定不是地雷呢?
值得注意的是:小Ho在这个问题上并不擅长,所以利用第一条规则导致一些未探明格子可以被判断为一定不是地雷,从而使得第二、三条规则可以作用的推理小Ho是做不出来的!所以每次规则的推导应当视作独立的,即不基于任何其他推导出的结论进行

输入

每个测试点(输入文件)存在多组测试数据。
每个测试点的第一行为一个整数Task,表示测试数据的组数。
在一组测试数据中:
第1行为2个整数N,M,表示迷宫的大小。
接下来的N行,每行M个整数,为一个矩阵A,用以描述整个迷宫,其中对于每一个格子A[i][j],若A[i][j]=-1,则表示该格子没有被探明,若0<=A[i][j]<=8,则表示该格子已经被探明了,且数值代表该格子附近8个格子中的地雷数。<>
对于100%的数据,满足:5<=N、M<=2*10^2, -1<=A[i][j]<=8。<>
对于100%的数据,满足:符合数据描述的迷宫一定存在。

输出

对于每组测试数据,输出2个整数,分别为一定为地雷的未探明格子数和一定不为地雷的未探明格子数。
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 }
Read full article from hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷・二 - 李舜阳 - 博客园

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts