链接:https://www.nowcoder.com/acm/contest/118/A
来源:牛客网
PUBG
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
最近,喜爱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
我的方法就是bfs,类似spfa
#include<iostream> #include<cstring> #include<string> #include<cmath> #include <queue> #include<stack> #include<cstdio> #include<vector> #include<deque> #include<algorithm> #include<iomanip> #define inf 0x3f3f3f3f #define ll long long using namespace std; int a[105][105]; int v[105][105]; int s[105][105]; int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; struct node { int x,y; }; queue<node>q; int main() { int n; int si,sj; int ei,ej; while(cin>>n) { int min=inf; memset(s,inf,sizeof(s)); memset(v,0,sizeof(v)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; if(a[i][j]==-1) { si=i; sj=j; a[i][j]=0; } if(a[i][j]==-2) { ei=i; ej=j; a[i][j]=0; } } } node c; c.x=si; c.y=sj; v[si][sj]=1; s[si][sj]=0; q.push(c); //有点类似spfa while(!q.empty()) { node c=q.front(); q.pop(); v[c.x][c.y]=0;//标记在不在队列里,因为可能等会会更新会更优 for(int i=0;i<4;i++) { int xx=c.x+d[i][0]; int yy=c.y+d[i][1]; if(xx<1||yy<1||xx>n||yy>n) continue; if(s[c.x][c.y]+a[xx][yy]<s[xx][yy]) { s[xx][yy]=s[c.x][c.y]+a[xx][yy]; if(!v[xx][yy]) { v[xx][yy]=1; node h; h.x=xx; h.y=yy; q.push(h);//更新了,不在队列里就放队列里 } } } } cout<<s[ei][ej]<<endl; } return 0; }