2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 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<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;
}

猜你喜欢

转载自blog.csdn.net/ant_e_zz/article/details/80215779
今日推荐