链接:
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; }