PUBG
2024-08-22 21:42:59
题目描述
最近,喜爱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
输入
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 <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
int dir[][]={{,},{-,},{,},{,-}};
int dp[][],vis[][];
int g[][];
int n,sx,sy,tx,ty;
struct node
{
int x;
int y;
int value;
bool operator<(const node &a) const
{
return a.value<value;
}
}ans,pos;
void dfs(int u,int v,int A,int B)
{
priority_queue<node>q;
memset(dp,,sizeof(dp));
memset(g,,sizeof(g));
ans.x=u;
ans.y=v;
ans.value=;
dp[u][v]=;
g[u][v]=;
q.push(ans);
while(!q.empty())
{
pos=q.top();
q.pop();
if(pos.x==A && pos.y==B)
{
printf("%d\n",pos.value);
return ;
}
for(int i=;i<;i++)
{
int xx=pos.x+dir[i][];
int yy=pos.y+dir[i][];
if(xx>= && xx<=n && yy>= && yy<=n && dp[xx][yy]>pos.value+vis[xx][yy] && !g[xx][yy])
{
g[xx][yy]=;
ans.x=xx;
ans.y=yy;
ans.value=pos.value+vis[xx][yy];
dp[xx][yy]=pos.value+vis[xx][yy];
q.push(ans);
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(vis,,sizeof(vis));
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&vis[i][j]);
if(vis[i][j]==-) {sx=i;sy=j;}
if(vis[i][j]==-) {tx=i;ty=j;}
}
}
vis[tx][ty]=vis[sx][sy]=;
dfs(sx,sy,tx,ty);
}
return ;
}
最新文章
- MYSQL的安装
- Cenots7编译Opencv3.1错误:下载ippicv,解决方案
- C#/net 使用Protocol Buffers入门
- LWP 轻量级线程的意义与实现
- android listview 加载图片错乱(错位)
- vim之pydiction插件
- Java并发——同步容器与并发容器
- svn的初级使用
- 2015第23周四HTML特殊字符显示问题
- Uva11582
- html5应用程序缓存
- Quartz.Net学习笔记
- thinkphp5.0 ajax分页
- 如何扩展Orchard
- web安全测试---AppScan扫描工具
- 【笔记】计算机原理,网络,Linux操作系统
- 20170805_Elasticsearch_简介和安装
- Facebook的一些基本操作(网页版)
- 阿里云RDS备份在本地mysql快速还原
- shiro 会话管理