Untitled
unknown
plain_text
2 years ago
2.7 kB
25
Indexable
#include <iostream>
using namespace std;
class Queue
{
private:
int front, rear;
int Data[100000000];
public:
Queue();
void reset();
void enQueue(int value);
int deQueue();
bool isEmpty();
};
Queue::Queue(){
front=rear=-1;
}
void Queue::reset(){
front=rear=-1;
}
void Queue::enQueue(int value){
Data[++rear]=value;
}
int Queue::deQueue(){
return Data[++front];
}
bool Queue::isEmpty(){
return front==rear;
}
Queue rQueue, cQueue;
int N, M, Map[100][100], visit[100][100];
int dx[]={0,0,-1,1},
dy[]={-1,1,0,0};
void BFS(int value){
for (int i=0; i<N; i++){
for (int j=0; j<M; j++){
visit[i][j]=false;
}
}
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)
&& Map[i][j]<=value && visit[i][j]==false)
{
rQueue.reset();
cQueue.reset();
rQueue.enQueue(i);
cQueue.enQueue(j);
visit[i][j]=true;
while (rQueue.isEmpty()==false){
int cr=rQueue.deQueue();
int cc=cQueue.deQueue();
for (int idx=0; idx<4; idx++){
int nr=cr+dx[idx];
int nc=cc+dy[idx];
if (nr>=0 && nr<N && nc>=0 && nc<M &&
Map[nr][nc]<=Map[cr][cc] && visit[nr][nc]==false)
{
rQueue.enQueue(nr);
cQueue.enQueue(nc);
visit[nr][nc]=true;
}
}
}
}
}
}
}
bool Split(){
int vung=0;
for (int i=0; i<N; i++){
for (int j=0; j<M; j++){
if (visit[i][j]==false){
vung++;
if (vung==2)
return true;
rQueue.reset();
cQueue.reset();
rQueue.enQueue(i);
cQueue.enQueue(j);
visit[i][j]=true;
while (rQueue.isEmpty()==false){
int cr=rQueue.deQueue();
int cc=cQueue.deQueue();
for (int idx=0; idx<4; idx++){
int nr=cr+dx[idx];
int nc=cc+dy[idx];
if (nr>=0 && nr<N && nc>=0 && nc<M
&& visit[nr][nc]==false)
{
rQueue.enQueue(nr);
cQueue.enQueue(nc);
visit[nr][nc]=true;
}
}
}
}
}
}
return false;
}
int main(){
freopen("input.txt", "r", stdin);
int tc=1;
while(1){
cin>>N>>M;
if (N==0 && M==0)
break;
int level=0, Max=0;
for (int i=0; i<N; i++){
for (int j=0; j<M; j++){
cin>>Map[i][j];
if (Map[i][j]>Max)
Max=Map[i][j];
}
}
while(1){
if (level==Max){
cout<<"Case "<<tc<<": Island never splits."<<endl;
break;
}
BFS(level);
//Neu hon dao bi chia cat
if (Split()==true){
cout<<"Case "<<tc<<": Island splits when ocean raises "<< level <<" feet."<<endl;
break;
}
level++;
}
tc++;
}
return 0;
}
Editor is loading...
Leave a Comment