链接: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代表安全区。
输出描述:
对于每组测试数据,请输出从当前位置到安全区所遇到最少的敌人数量,每个输出占一行。
输入描述:
题目包含多组测试,请处理到文件结束;第一行是一个整数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
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
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;
}