Untitled

 avatar
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