Untitled

 avatar
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