PUBG

链接:https://www.nowcoder.com/acm/contest/118/A
来源:牛客网

最近,喜爱ACM的PBY同学沉迷吃鸡,无法自拔,于是又来到了熟悉的ERANGEL。经过一番搜寻,PBY同学准备动身前往安全区,但是,地图中埋伏了许多LYB,PBY的枪法很差,希望你能够帮他找到一条路线,每次只能向上、下、左、右移动,尽可能遇到较少的敌人。

输入描述:

题目包含多组测试,请处理到文件结束;
第一行是一个整数n,代表地图的大小;
接下来的n行中,每行包含n个整数a,每个数字a代表当前位置敌人的数量;
1 < n <= 100,1 <= a <= 100,-1代表当前位置,-2代表安全区。

输出描述:

对于每组测试数据,请输出从当前位置到安全区所遇到最少的敌人数量,每个输出占一行。

#include 
using namespace std;
int a[101][101];
int b[101][101];
int zz[4][2]={0,1,1,0,0,-1,-1,0};
struct haha{  
    int x;  
    int y;  
    int he; 
    bool operator<(const haha &s)const  
    {  
        return he > s.he;  
    }  
};  
int main(){
	int n;
	while(~scanf("%d",&n)){
	int x1,y1;
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
			if(a[i][j]==-1)
				x1=i,y1=j;
		}		
	}
	//queueq;
	priority_queue q;
	haha w;
	w.x=x1;
	w.y=y1;
	b[x1][y1]=1;
	w.he=0;
	q.push(w);
	while(!q.empty()){
		haha now=q.top();
		q.pop();
		if(a[now.x][now.y]==-2){
			printf("%d\n",now.he+2);
			break;
		}
		for(int i=0;i<4;i++){
			int xx=now.x+zz[i][0];
			int yy=now.y+zz[i][1];
			if(xx<=0 || xx>n || yy<=0 || yy>n)
				continue;
			if(b[xx][yy]==1)
				continue;
			b[xx][yy]=1;
			haha jiu;
			jiu.x=xx;
			jiu.y=yy;
			jiu.he=now.he+a[xx][yy];
			q.push(jiu);
		}
	}
    }
	return 0;
}

你可能感兴趣的:(搜索篇)