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