链接:
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;
const int MAXN=110;
int ma[MAXN][MAXN],dis[MAXN][MAXN];
int n,sx,sy,fx,fy,inf;
int out(int x,int y) //判越界
{
if(x<0||x>=n||y<0||y>=n)
return 1;
return 0;
}
int main()
{
inf=1e7;
while(cin>>n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>ma[i][j];
if(ma[i][j]==-1) //读入,负数需要归零,不然最短路选择会有问题
{
sx=i;sy=j; //标记起始点,下面标记终点
ma[i][j]=0;
}
else if(ma[i][j]==-2)
{
fx=i;fy=j;
ma[i][j]=0;
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j]=inf; //初始化最大值
dis[sx][sy]=0;
int Next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
priority_queue<pair<int,int> >q;
q.push(make_pair(0,sx*n+sy)); //通过此方式来确定数字所包含的X和y
while(!q.empty())
{
pair<int,int>t;
t=q.top();q.pop();
int nx=t.second/n;
int ny=t.second%n;
if(-1*t.first!=dis[nx][ny]) //正常的dijkstra
continue;
for(int i=0;i<4;i++)
{
int tx=nx+Next[i][0];
int ty=ny+Next[i][1];
if(out(tx,ty))
continue;
if(dis[tx][ty]>dis[nx][ny]+ma[tx][ty])
{
dis[tx][ty]=dis[nx][ny]+ma[tx][ty];
q.push(make_pair(-dis[tx][ty],tx*n+ty));
}
}
}
cout<<dis[fx][fy]<<endl;
}
return 0;
}