题目连接:http://acm.csust.edu.cn/problem/4051
博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13941896.html

Description

父亲是最高法院的法官,母亲是国际人道救援组织职员。在父母的熏陶下,有强烈的正义感,弥子初中起便担任着学校的风纪委员。

高二的时候,弥子加入了学生会,由于学生会每天都有大量的工作要做,弥子放学后必须马上去学生会处理文件,但是她没有忘记自己风纪委员的工作,再去往学生会的路上,她会先去视察多个违纪现象高发地点中的两个,然后再前往学生会,由于时间紧迫,她必须有选择两个地点使她视察完后再去往学生会所花费的时间最小。

我们把整个秀知院看成一个 w∗ww * ww∗w 的二维平面图,每个位置可表示为 (x,y)(x, y)(x,y) , (1≤x≤w,1≤y≤w)(1 \leq x \leq w, 1 \leq y \leq w)(1≤x≤w,1≤y≤w) ,每个点可以向上下左右四个方向进行移动,每次移动所花费的时间是 111 ,当然秀知院有 mmm 个建筑,弥子不能穿过这些建筑,只能绕路。

总共有 nnn 个违纪现象高发地点,我们用 (xi,yi)(x_i, y_i)(xi​,yi​) 表示,(1≤i≤n)(1 \leq i \leq n)(1≤i≤n) , 保证这 nnn 个地点不会重复

接下来有 qqq 组询问, 每组询问告诉你 弥子一开始的位置位于 (sx,sy)(sx, sy)(sx,sy) , 学生会位于 (ex,ey)(ex, ey)(ex,ey) ,对于每组询问,请你求出在视察两个违纪现象高发点后再前往学生会的最小时间

Input

第一行一个整数 www , (1≤w≤1e3)(1 \leq w \leq 1e3)(1≤w≤1e3) 代表秀知院的二维平面的宽

接下来一个整数 nnn , (1≤n≤30)(1 \leq n \leq 30)(1≤n≤30) ,代表违纪现象高发点的数量

接下来 nnn 行,每行两个整数 x,yx, yx,y ,(1≤x,y≤w)(1 \leq x, y \leq w)(1≤x,y≤w) ,代表每个违纪现象高发点的坐标

接下来一个整数 mmm , (1≤m≤w∗w)(1 \leq m \leq w * w)(1≤m≤w∗w) ,代表建筑的数量

接下来 mmm 行,每行两个整数 x,yx, yx,y ,(1≤x,y≤w)(1 \leq x, y \leq w)(1≤x,y≤w) ,代表建筑的坐标

再接下来一行一个整数 qqq , (1≤q≤1e5)(1 \leq q \leq 1e5)(1≤q≤1e5) 代表询问的次数

接下来 qqq 行,每行四个整数 sx,sy,ex,eysx, sy, ex, eysx,sy,ex,ey ,(1≤sx,sy,ex,ey≤w)(1 \leq sx, sy, ex, ey \leq w)(1≤sx,sy,ex,ey≤w) , 代表弥子一开始的位置和学生会的位置, 可能存在 sx=ex,sy=eysx = ex, sy = eysx=ex,sy=ey 的情况

输出 qqq 行, 每行一个整数,代表每个询问的答案,若弥子无法完成任务,则输出 −1-1−1

Output

输出 qqq 行, 每行一个整数,代表每个询问的答案

Sample Input 1
5
2
4 5
3 2
2
2 2
3 5
1
5 5 4 4

Sample Output 1
8

Sample Input 2
5
1
4 1
2
1 3
5 3
2
3 3 5 5
4 4 1 4

Sample Output 2
-1
-1

emmm,需要到达两个违纪点,但违纪点的数量不是很多,只有30个,那么我们可以bfs预处理出每个违纪点到图上每个点的距离,其理论大概复杂度为O(30n2)O(30n^2)O(30n2),接下来处理问题,我们可以直接枚举先到哪个点后到哪个点,其复杂度为qm2qm^2qm2其中m表示违纪点的数量。于是我们就有ans=min(dis[s][i]+dis[i][j]+dis[j][t])ans=min(dis[s][i]+dis[i][j]+dis[j][t])ans=min(dis[s][i]+dis[i][j]+dis[j][t])其中s为起点,i,j表示第i,j个违纪点,t为终点。那么代码也很好写。

以下是AC代码:

#include <bits/stdc++.h>
using namespace std;const int mac=1e6+10;
const int maxn=100;
const int maxw=1e3+10;
const int inf=2e8+10;struct node
{int x,y;
}bug[maxn];
int dis[maxw][maxw][33];
bool vis[maxw][maxw],box[maxw][maxw];
int dx[]={0,-1,1,0},dy[]={1,0,0,-1};inline bool ok(int x,int y,int w)
{   if (x>=1 && x<=w && y>=1 && y<=w) return true; return false;
}void bfs(int sx,int sy,int w,int id)
{queue<node>q;q.push(node{sx,sy});memset(vis,false,sizeof vis);dis[sx][sy][id]=0;while (!q.empty()){node u=q.front();q.pop();if (vis[u.x][u.y]) continue;vis[u.x][u.y]=true;for (int i=0; i<4; i++){int x=u.x+dx[i],y=u.y+dy[i];if (!ok(x,y,w) || vis[x][y] || box[x][y]) continue;dis[x][y][id]=dis[u.x][u.y][id]+1;q.push(node{x,y});}   }
}int main(int argc, char const *argv[])
{int w,n,m;scanf ("%d%d",&w,&n);for (int i=1; i<=n; i++){int x,y;scanf ("%d%d",&x,&y);bug[i]=node{x,y};}scanf ("%d",&m);memset(box,false,sizeof box);for (int i=1; i<=m; i++){int x,y;scanf ("%d%d",&x,&y);box[x][y]=true;}for (int i=1; i<=n; i++)for (int j=1; j<=w; j++)for (int k=1; k<=w; k++)dis[j][k][i]=inf;if (n>=2){for (int i=1; i<=n; i++)bfs(bug[i].x,bug[i].y,w,i);}int q;scanf ("%d",&q);while (q--){int sx,sy,ex,ey;scanf ("%d%d%d%d",&sx,&sy,&ex,&ey);if (n<2) {printf("-1\n");  continue;}int ans=inf;for (int i=1; i<=n; i++)for (int j=1; j<=n; j++){if (i==j) continue;int px=bug[j].x,py=bug[j].y;ans=min(ans,dis[sx][sy][i]+dis[ex][ey][j]+dis[px][py][i]);}if (ans==inf) printf("-1\n");else printf("%d\n",ans);}return 0;
}

CSUSTOJ-伊井野弥子是风纪委员(简单BFS)相关推荐

  1. 题解 —— 风纪委员

    题目: 小爱作为风纪委员绝对不能容许扰乱风纪的事情出现!当然和小太的事情总是要在合适的时间和地点解决的~而且反正也得到了上面的许可外加声援什么的. 好吧扯远了~现在学校里有一些经常扰乱风纪的少年和少女 ...

  2. 井字棋小游戏c语言简单编码,C语言实现井字棋小游戏

    C语言实现简单的"井字棋游戏",供大家参考,具体内容如下 总体构造: 1.游戏菜单的逻辑实现 2.游戏本体的代码实现 part 1:游戏菜单的整体逻辑 ①简单的通过一个输入0和1的 ...

  3. c++主线程等待子线程结束_简单明了的 Python 多线程来了 | 原力计划

    作者 | 万里羊责编 | 王晓曼出品 | CSDN博客线程和进程计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行.如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间 ...

  4. 井字棋小游戏c语言简单编码,井字棋小游戏(C语言)

    1 #include 2 #include 3 #include 4 #include 5 #include 6 7 void drawBoard(char *board) //绘制棋盘 8 {9 p ...

  5. 【oracle】查询===Oracle数据库 子查询(嵌套查询)简单例子

    例如: 查询工资比Simth工资高的员工信息 第一步:查询Smith的工资数 select salary from s_emp where last_name='Smith'; 结果: SALARY ...

  6. oracle中update子查询,UPDATE语句-简单形式-子查询形式

    关于UPDATE语句 一般的update语句格式比较简单,由where过滤子句和set子句组成. 当where和set都需要关联一个表进行查询时,整个update执行时,就需要对被关联的表进行两次扫描 ...

  7. 长沙理工大学第十五届程序设计竞赛部分题解

    校赛都过去了几天了才想起来写博客 老懒狗了 这次感觉算一点点超常发挥 出了七题 排在第八名 还拿了两个一血气球 虽然之后发现有道题暴力就能过 但是还是挺开心的 而且这次比yy他们队还高一名 哈哈哈哈 ...

  8. 给你看个宝贝:GitHub 最野的开源库,把你拿捏的死死的。。。

    上一篇:3600万中国人在抖音"上清华" 0.2T架构师学习资料干货分享 茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科.素馨属直立或攀援灌 ...

  9. 《东周列国志》第七十九回 归女乐黎弥阻孔子 栖会稽文种通宰嚭

    话说齐侯自会夹谷归后,晏婴病卒.景公哀泣数日,正忧朝中乏人,复闻孔子相鲁,鲁国大治,惊曰:"鲁相孔子必霸,霸必争地,齐为近邻,恐祸之先及,奈何?"大夫黎弥进曰:"君患孔子 ...

最新文章

  1. Scala Iterator(迭代器)详解
  2. 世界坐标系,摄像机坐标系、图像坐标系关系汇总
  3. 找零钱--C语言实现
  4. 7-2 定义日期类 (28 分)
  5. shell中日期的使用当前日期的加减
  6. MyEclipse 2015 CI
  7. OpenCV图像处理之直方图
  8. 国内使用谷歌地图方案
  9. win7设置自动开机时间_win7本地连接ip设置方法
  10. 《东周列国志》第一百回 鲁仲连不肯帝秦 信陵君窃符救赵
  11. IT人才薪水“虚高” ,寡头垄断下小企业工程师告急[转]
  12. Semi-Supervised Semantic Image Segmentation with Self-correcting Networks:基于自校正网络的半监督语义图像分割
  13. vue项目性能优化(图片优化)
  14. SkyEye(一种软件模拟的系统开发平台)
  15. 老板电器携手华为HarmonyOS创新升级中国厨房新理念
  16. java我的世界114_我的世界114更新了什么_我的世界114更新内容_快吧单机游戏
  17. Netgear R6220桥接组网设置
  18. OCR开源库Tesseract汉字识别训练
  19. 新一年TurboGate邮件网关再次提醒小心勒索邮件
  20. 第三方支付公司之快钱

热门文章

  1. mysql mpm_centos7 mpm监控mysql
  2. 缓冲区的概念真的理解么?带你揭开缓冲区的面纱~
  3. 数学笔记29——反常积分和瑕积分
  4. 各平台播放器以及浏览器的navigator.userAgent
  5. 理财、文献、天池、Python
  6. 笔记木计算机自动关机怎么办,笔记本电脑突然自动关机怎么办
  7. 靠steam搬砖,投入不到5k,一个月净赚3万+
  8. 第5天 结构体、文字显示与GDT/IDT初始化
  9. Task04:集合运算
  10. 关于样本标准差(SD)与样本标准误差(SE)