【HDOJ】3329 The Flood
超简单BFS。
1 /* 3329 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 using namespace std; 8 9 #define MAXN 105 10 11 typedef struct node_t { 12 int x, y; 13 node_t() {} 14 node_t(int xx, int yy) { 15 x = xx; y = yy; 16 } 17 } node_t; 18 19 int n, m, h, total; 20 int map[MAXN][MAXN]; 21 bool visit[MAXN][MAXN]; 22 int dir[4][2] = { 23 -1,0,1,0,0,-1,0,1 24 }; 25 26 inline bool check(int x, int y) { 27 return x<0 || x>=n || y<0 || y>=m; 28 } 29 30 void border_bfs(int x, int y) { 31 int i, j, k; 32 int xx, yy; 33 queue<node_t> Q; 34 node_t nd; 35 36 Q.push(node_t(x, y)); 37 visit[x][y] = true; 38 39 while (!Q.empty()) { 40 nd = Q.front(); 41 Q.pop(); 42 --total; 43 for (i=0; i<4; ++i) { 44 xx = nd.x + dir[i][0]; 45 yy = nd.y + dir[i][1]; 46 if (check(xx, yy) || visit[xx][yy] || map[xx][yy]>h) 47 continue; 48 visit[xx][yy] = true; 49 Q.push(node_t(xx, yy)); 50 } 51 } 52 } 53 54 void bfs(int x, int y) { 55 int xx, yy, s; 56 int i, j, k; 57 queue<node_t> Q; 58 node_t nd; 59 60 Q.push(node_t(x, y)); 61 visit[x][y] = true; 62 63 while (!Q.empty()) { 64 nd = Q.front(); 65 Q.pop(); 66 --total; 67 for (i=0; i<4; ++i) { 68 xx = nd.x + dir[i][0]; 69 yy = nd.y + dir[i][1]; 70 if (check(xx,yy) || visit[xx][yy]) 71 continue; 72 visit[xx][yy] = true; 73 Q.push(node_t(xx, yy)); 74 } 75 } 76 } 77 78 int main() { 79 int t = 0; 80 int i, j, k, tmp; 81 bool flag; 82 int maxh; 83 84 #ifndef ONLINE_JUDGE 85 freopen("data.in", "r", stdin); 86 freopen("data.out", "w", stdout); 87 #endif 88 89 while (scanf("%d %d",&n,&m)!=EOF && (n||m)) { 90 maxh = -1; 91 for (i=0; i<n; ++i) { 92 for (j=0; j<m; ++j) { 93 scanf("%d", &map[i][j]); 94 if (map[i][j] > maxh) 95 maxh = map[i][j]; 96 } 97 } 98 tmp = n*m; 99 for (h=1; h<maxh; ++h) { 100 // handle border of map 101 total = tmp; 102 memset(visit, false, sizeof(visit)); 103 for (j=0; j<m; ++j) { 104 if (!visit[0][j] && map[0][j]<=h) 105 border_bfs(0, j); 106 if (!visit[n-1][j] && map[n-1][j]<=h) 107 border_bfs(n-1, j); 108 } 109 for (i=0; i<n; ++i) { 110 if (!visit[i][0] && map[i][0]<=h) 111 border_bfs(i, 0); 112 if (!visit[i][m-1] && map[i][m-1]<=h) 113 border_bfs(i, m-1); 114 } 115 // check if there exsits two or more lands 116 flag = false; 117 for (i=0; i<n; ++i) { 118 for (j=0; j<m; ++j) { 119 if (!visit[i][j]) { 120 flag = true; 121 break; 122 } 123 } 124 if (flag) 125 break; 126 } 127 if (flag) { 128 bfs(i, j); 129 if (total > 0) 130 break; 131 } 132 } 133 if (h < maxh) 134 printf("Case %d: Island splits when ocean rises %d feet.\n", ++t, h); 135 else 136 printf("Case %d: Island never splits.\n", ++t); 137 } 138 139 return 0; 140 }