Untitled
unknown
plain_text
2 years ago
2.8 kB
14
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