M-災難預警-浙江農林大學第十九屆程式設計競賽暨天梯賽選拔賽

如夢如花發表於2020-10-24

題目:災難預警

眾所周知,浙農林是一條河。
由於浙江農林大學的特殊地形,當你在下雨後漫步在農林大路上的時候
難免會出現一腳踩進一個水坑的情況的情況。而農農非常不喜歡踩到水坑的感覺,
請你幫忙設計一個程式來幫助農農判斷他能否在不踩入水坑的情況下回到
寢室。
已知,浙江農林大學可以表示為一個 N * N 的矩陣。
對於每個位置有一個海拔資料 h[i][j],當水位高度大於 h[i][j] 的時候,
這個位置就會形成一個水坑。
農農現在的座標是 (1, 1), 他的宿舍位於 (n, n).
農農只可以沿著上下左右四個方向走。
假如農農現在位於 (2, 2)那麼在不考慮水位的情況下,他可以去的地方有 

(1, 2),(2,1),(3, 2),(2, 3)

輸入描述:在這裡插入圖片描述

輸出描述:

在這裡插入圖片描述

樣例:

在這裡插入圖片描述

思路:這題一道簡單的bfs+優先佇列,按層次遍歷,將遍歷到的點存入佇列,然後不斷取出h大的節點,繼續遍歷,當遍歷到n,n,時結束,以遍歷過程中的最小h為依據,水位<=h,能走,否則,不能。有點貪心的味道。

#include<bits/stdc++.h>
using namespace std;
int mapp[1005][1005];
int minn=10000000;
int dis[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int us[1005][1005]={0};
int flag=0;
int n;
struct s{
	int x;
	int y;
	int z;
};
bool operator<(s a , s b){
    return a.z<b.z;
}
priority_queue<s>q;
void bfs(int a,int b,int c){
q.push({a,b,c});
while(!q.empty()){
int t=q.top().z;
int l=q.top().x;
int r=q.top().y;
q.pop();
if(l==n&&r==n){
	flag=t; 
	return;
}
for(int i=0;i<4;i++){
	int x=l+dis[i][0];
	int y=r+dis[i][1];
	if(x>0&&y>0&&x<=n&&y<=n&&us[x][y]==0){
	us[x][y]=1;
	if(mapp[x][y]<t)
	q.push({x,y,mapp[x][y]});
	else
	q.push({x,y,t});
	
}
}
}
}
int main(){
	
	cin>>n;		
	for(int j=1;j<=n;j++){
			for(int l=1;l<=n;l++){
				scanf("%d",&mapp[j][l]);
			}
		}		
		us[1][1]=1;
		bfs(1,1,mapp[1][1]);
	int q;
	scanf("%d",&q);

	for(int j=1;j<=q;j++){
		int p;
		scanf("%d",&p);
		if(p>flag){
			printf("Hmmm\n");
		}
		else
		printf("Wuhu\n");
	}
}

相關文章