Untitled
unknown
plain_text
a year ago
2.8 kB
6
Indexable
#include <iostream> using namespace std; int N, M; int arr[105][105]; int visited[105][105]; int height, minH; class Queue{ int front, rear; int q[10000]; public: Queue(); void enQueue(int value); int deQueue(); void reset(); bool is_Empty(); }; Queue::Queue(){ front = rear = -1; } void Queue::enQueue(int value){ q[++rear] = value; } int Queue::deQueue(){ return q[++front]; } void Queue::reset(){ front = rear = -1; } bool Queue::is_Empty(){ return front == rear; } int X[4] = {-1, 1, 0, 0}; int Y[4] = {0, 0, -1, 1}; Queue rQueue, cQueue; int cnt; Queue nrQueue, ncQueue; void check(int row, int col){ nrQueue.reset(); ncQueue.reset(); visited[row][col] = 1; nrQueue.enQueue(row); ncQueue.enQueue(col); while(rQueue.is_Empty() == false){ int cr = nrQueue.deQueue(); int cc = ncQueue.deQueue(); for(int i = 0; i < 4; i++){ int nr = cr + X[i]; int nc = cc + Y[i]; if(nr >= 0 && nr < N && nc >= 0 && nc < M && visited[nr][nc] == 0 && arr[nr][nc] != -1){ visited[nr][nc] = 1; nrQueue.enQueue(nr); ncQueue.enQueue(nc); } } } } void BFS(int h){ for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ if(i == 0 || i == N - 1 || j == 0 || j == M - 1){ if(arr[i][j] <= h){ arr[i][j] = -1; rQueue.enQueue(i); cQueue.enQueue(j); } } } } while(rQueue.is_Empty() == false){ int cr = rQueue.deQueue(); int cc = cQueue.deQueue(); for(int i = 0; i < 4; i++){ int nr = cr + X[i]; int nc = cc + Y[i]; if(nr >= 0 && nr < N && nc >= 0 && nc < M && arr[nr][nc] <= h && arr[nr][nc] != -1){ arr[nr][nc] = -1; rQueue.enQueue(nr); cQueue.enQueue(nc); } } } } int main(){ freopen("input.txt", "rt", stdin); int tc = 1; while(1){ cin >> N >> M; if(N == 0 && M == 0){ break; } for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ cin >> arr[i][j]; } } height = 0; minH = 10000; for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ if(arr[i][j] > height){ height = arr[i][j]; } } } int res = -1; for(int h = 0; h < height; h++){ cnt = 0; for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ visited[i][j] = 0; } } BFS(h); for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ if(arr[i][j] != -1 && visited[i][j] == 0){ cnt++; check(i, j); } } } if(cnt >= 2){ res = h; break; } } cout << "Case #" << tc << ": "; if(res == -1){ cout << "Island never splits." << endl; }else{ cout << "Island splits when ocean rises " << res << " feet." << endl; } tc++; } return 0; }
Editor is loading...
Leave a Comment