博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Security Guards (Gym - 101954B)( bfs + 打表 )
阅读量:4967 次
发布时间:2019-06-12

本文共 1458 字,大约阅读时间需要 4 分钟。

题意及思路

主要是讲先给出所有guard的位置,再给出所有incidents的位置,求出guard到达每个incident处最小的steps,其中guard每次可以向四周8个方向移动。

思路:对于每个guard使用bfs遍历它周围的点,算出相应的点到它的距离。

AC代码

#include
using namespace std;int N, Q;struct Pla{ int x, y;};int dist[5000+10][5000+10];int dx[] = {-1, -1, -1, 1, 1, 1, 0, 0};int dy[] = {0, 1, -1, 0, 1, -1, 1, -1};queue
q;void bfs(){ while(!q.empty()) { Pla top = q.front(); q.pop(); for(int i = 0; i < 8; i++) { int curx = top.x + dx[i], cury = top.y + dy[i]; if(curx < 0 || curx > 5000 || cury < 0 || cury > 5000) //先写这个会快些 continue; if(dist[curx][cury] == -1) { Pla tmp = top; tmp.x = curx, tmp.y = cury; dist[curx][cury] = dist[top.x][top.y] + 1; q.push(tmp); } } }}int main(){// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); scanf("%d%d", &N, &Q); memset(dist, -1, sizeof(dist)); while(!q.empty()) q.pop(); for(int i = 0; i < N; i++) { Pla guard; scanf("%d%d", &guard.x, &guard.y); dist[guard.x][guard.y] = 0; //guard位置处都置为0 q.push(guard); //将guard插入队列中,在后面进行bfs } bfs(); for(int i = 0; i < Q; i++) { int a, b; scanf("%d%d", &a, &b); printf("%d\n", dist[a][b]); }}

转载于:https://www.cnblogs.com/KeepZ/p/11361109.html

你可能感兴趣的文章
4. 尽可能不用Distinct
查看>>
利用pip指定第三方包加载目录
查看>>
webrtc 音频一点相关知识
查看>>
import from 'xxx'是如何找到node_modules目录下的
查看>>
Java如何清空数组、对象
查看>>
软件企业价格估算方法
查看>>
DOS命令--实用设置网络IP(无桌面)
查看>>
利用JQuery 解析MVC控制器传到前台的Json数据
查看>>
一种反射的方式
查看>>
android环境搭建
查看>>
写javascript是前台和后的内容的区别
查看>>
java旅程(二) 基本语法
查看>>
仓储repository概念
查看>>
freemarker<一>
查看>>
程序员的数学--排列组合(0)
查看>>
c语言 rand() 随机函数
查看>>
覆盖索引有何用?
查看>>
mobile base
查看>>
linux 内核配置 library routines
查看>>
docker应用,后端服务出现OOM情况排查
查看>>