Security Guards (Gym - 101954B)( bfs + 打表 )

题意及思路

题目主要是讲先给出所有guard的位置,再给出所有incidents的位置,求出guard到达每个incident处最小的steps,其中guard每次可以向四周8个方向移动。
思路:对于每个guard使用bfs遍历它周围的点,算出相应的点到它的距离。

AC代码

#include<bits/stdc++.h>
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<Pla> 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

时间: 2024-11-06 17:11:57

Security Guards (Gym - 101954B)( bfs + 打表 )的相关文章

HDU 1043 Eight(反向BFS+打表+康托展开)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各个状态记录下来,因为数字太大所以用康托展开将数字离散化. 代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<st

HDU1430 BFS + 打表 + 康托展开

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 , 一道比较好的题. 这道题要用到很多知识,康托展开.BFS.打表的预处理还要用到一一映射,做完受益匪浅. 其实这道题也可以用双向BFS来写,思路也已经有了,过几天再来写. 本文持续更新. 先说搜索部分: 对于魔板的每一个状态,都可以进行A.B.C三种操作,所以按照图论来讲,就是操作前的状态可以到达操作后的状态,所以就这样转换成了广搜问题. 这里要注意一点,由于题目要求字典序最小的,所以搜索的

HDU1043 八数码(BFS + 打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界:http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 我自己是用哈希(康托展开) + BFS  + 打表过的,第三重境界. 由于一些高级的搜索现在还没学,所以目前能升级的也就是用双向BFS来做了,等过几天有心情了来做. 本文

2015北京网络赛 G Boxes BFS+打表

G Boxes 题意:n个位置摆有n个箱子,每次移动只能把相邻的垒起来,且上面的必须小于下面的.求摆成升序需要移动多少步. 思路:这里的n很小,只有7.但是bfs最快的情况需要2s左右,所以就打表了. 诡异的是n = 6时居然都跑不出来都超时,连6也打了个表. 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <

bfs 邻接表(需要优化 可能会RE *【模板】)

//---基于邻接表的bfs #include <stdio.h> #include <string.h> #include <iostream> #include <string> #include <algorithm> #include <queue> using namespace std; struct node { int date; struct node *next; }*head[101], *tail[101];

hpu 1713 参观城市 &lt;bfs+邻接表&gt;

1713: 参观城市 时间限制: 1 Sec  内存限制: 128 MB 提交: 35  解决: 20 [提交][状态][讨论版] 题目描述 有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,小明在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1&

hdu 6253 (bfs打表)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6253 题意: 马可以往一个方向走两步,然后转个弯走一步,这样算一次动作,求问马n次动作后,能到达多少个点,重复到达的点只算一次. 思路: 一开始完全没思路,画图找了半天把自己画崩了,后面看到数据和样例感觉这应该是一道公式题,然后打了一个表.. 打表代码: #include<bits/stdc++.h> using namespace std; #define ull unsigned long lon

hdoj1043 Eight(逆向BFS+打表+康拓展开)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 思路: 由于自己对康拓展开用的太少,看到这个题没想到康拓展开,最开始打算直接转换为数字,但太占内存了,又想到可以将状态存进set,后来查了一下发现原来是考察康拓展开.另外就是需要打表预处理,这样快很多.BFS部分就是已知终点,从终点逆向搜索,并存每个状态的上一个状态以及操作,以便输出. 坑点:输入是多组输入,POJ那道题才是一组输入,卡在这一上午T_T. 有一组输入为12345678x,需要特

bfs 邻接表

#include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int date; struct node *next; }*h[1000],*head[1000]; int v[10000],vi[10000]; int i,j; int t,n,m,k; void chu(int z) { for(i=0;i<z;i++) {h[i]=(struct node*)malloc(size