【Dijkstra】 PUBG 北京信息科技大学校赛A

链接: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代表安全区。
输出描述:
对于每组测试数据,请输出从当前位置到安全区所遇到最少的敌人数量,每个输出占一行。

示例1

输入
5
6 6 0 -2 3
4 2 1 2 1
2 2 8 9 7
8 1 2 1 -1
9 7 2 1 2

输出
9



示例2

输入
5
62 33 18 -2 85
85 73 69 59 83
44 38 84 96 55
-1 11 90 34 50
19 73 45 53 95

输出

173

#include <bits/stdc++.h>
using namespace std;

const int inf = 0x7FFFFFFF;
int n;
int si, sj, ei, ej;
int dir[4][2] = {{ -1, 0}, {1, 0}, {0, -1}, {0, 1}};
int s[110][110];
int dis[110][110];

void dijkstra ( int si, int sj )
{
	for ( int i = 0; i < n; i++ )
		for ( int j = 0; j < n; j++ )
			dis[i][j] = inf;
	dis[si][sj] = 0;
	//二维的距离
	priority_queue<pair<int, int>>que;
	//默认从大到小 第一关键字先于第二关键字
	que.push ( make_pair ( 0, si * n + sj ) );
	while ( !que.empty() )
	{
		pair<int, int>p = que.top();
		que.pop();
		int i = p.second / n;
		int j = p.second % n;
		//一维二维转换
		for ( int d = 0; d < 4; d++ )
		{
			int ti = i + dir[d][0];
			int tj = j + dir[d][1];
			if ( ti < 0 || ti >= n || tj < 0 || tj >= n ) continue;
			if ( dis[ti][tj] > dis[i][j] + s[ti][tj] )
			{
				dis[ti][tj] = dis[i][j] + s[ti][tj];
				que.push ( make_pair ( -dis[ti][tj], n * ti + tj ) );
				//小的优先取出 存负
			}
		}
	}
}

int main()
{

	while ( ~scanf ( "%d", &n ) )
	{
		for ( int i = 0; i < n; i++ )
			for ( int j = 0; j < n; j++ )
			{
				scanf ( "%d", &s[i][j] );
				if ( s[i][j] == -1 )
				{
					si = i, sj = j;
					s[i][j] = 0;
				}
				else if ( s[i][j] == -2 )
				{
					ei = i, ej = j;
					s[i][j] = 0;
				}
			}
		dijkstra ( si, sj );
		printf ( "%d\n", dis[ei][ej] );
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ummmmm/article/details/80210896