Untitled
unknown
plain_text
a year ago
2.7 kB
5
Indexable
#include <iostream> using namespace std; int n, m; const int MN = 150; int a[MN][MN]; int t[MN][MN]; int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; bool visited[MN][MN]; void dfs(int x, int y, int mid) { if (!(0 <= x && x < n && 0 <= y && y < m) || t[x][y] > mid || visited[x][y]) { return; } t[x][y] = 0; visited[x][y] = true; for (int i = 0; i < 4; ++i) { dfs(x + dx[i], y + dy[i], mid); } } bool visited2[MN][MN]; void dfs2(int x, int y) { if (!(0 <= x && x < n && 0 <= y && y < m) || visited2[x][y] || t[x][y] == 0) { return; } visited2[x][y] = true; for (int i = 0; i < 4; ++i) { dfs2(x + dx[i], y + dy[i]); } } int main() { int test_case = 0; while (1) { test_case++; cin >> n >> m; if (n == 0 && m == 0) { break; } int max_height = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> a[i][j]; if (i == 0 || j == 0 || i == n - 1 || j == m - 1) { max_height = max(max_height, a[i][j]); } } } int left = 0; int right = max_height; int ans = -1; while (left <= right) { int mid = (left + right) / 2; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { t[i][j] = a[i][j]; visited[i][j] = false; visited2[i][j] = false; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (i == 0 || j == 0 || i == n - 1 || j == m - 1) { dfs(i, j, mid); } } } int stplt = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (t[i][j] != 0 && visited2[i][j] == 0) { stplt++; dfs2(i, j); } } } if (stplt > 1) { ans = mid; right = mid - 1; } else { left = mid + 1; } } cout << "Case " << test_case << ": "; if (ans == -1) { cout << "Island never splits."; } else { cout << "Island splits when ocean rises " << ans << " feet."; } cout << '\n'; } return 0; }
Editor is loading...
Leave a Comment