题目描述

最近,喜爱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 ;
}

最新文章

  1. MYSQL的安装
  2. Cenots7编译Opencv3.1错误:下载ippicv,解决方案
  3. C#/net 使用Protocol Buffers入门
  4. LWP 轻量级线程的意义与实现
  5. android listview 加载图片错乱(错位)
  6. vim之pydiction插件
  7. Java并发——同步容器与并发容器
  8. svn的初级使用
  9. 2015第23周四HTML特殊字符显示问题
  10. Uva11582
  11. html5应用程序缓存
  12. Quartz.Net学习笔记
  13. thinkphp5.0 ajax分页
  14. 如何扩展Orchard
  15. web安全测试---AppScan扫描工具
  16. 【笔记】计算机原理,网络,Linux操作系统
  17. 20170805_Elasticsearch_简介和安装
  18. Facebook的一些基本操作(网页版)
  19. 阿里云RDS备份在本地mysql快速还原
  20. shiro 会话管理

热门文章

  1. JAVA设计模式之【策略模式】
  2. ThinkPHP5.0最最最最最简单实例
  3. 固比固布局 圣杯布局 css实现传统手机app布局
  4. validation-api参数校验
  5. JS异步操作之promise发送短信验证码.html
  6. XShell与虚拟机连接的IP问题
  7. 使用rman恢复数据小结
  8. pthread_cleanup_push
  9. [Python随笔]&gt;&gt;range()函数?
  10. grant 命令