链接: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 <bits/stdc++.h>
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;
}
}
//queue<haha>q;
priority_queue<haha> 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;
}