Description

贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为了能安全地离开,贝茜不得不按照骑士们的要求,在森林寻找一种特殊的灌木并带一棵给他们.当然,贝茜想早点离开这可怕的森林,于是她必须尽快完成骑士们给的任务,贝茜随身带着这片森林的地图,地图上的森林被放入了直角坐标系,并按x,y轴上的单位长度划分成了W×H(1≤W,H≤1000)块,贝茜在地图上查出了她自己以及骑士们所在的位置,当然地图上也标注了她所需要的灌木生长的区域.某些区域是不能通过的(比如说沼泽地,悬崖,以及食人兔的聚居地).在没有找到灌木之前,贝茜不能通过骑士们所在的那个区域,为了确保她自己不会迷路,贝茜只向正北、正东、正南、正西四个方向移动(注意,她不会走对角线).她要走整整一天,才能从某块区域走到与它相邻的那块区域.    输入数据保证贝茜一定能完成骑士的任务.贝茜希望你能帮她计算一下,她最少需要多少天才可脱离这可怕的地方?

Input

第1行输入2个用空格隔开的整数,即题目中提到的W、H.
接下来输入贝茜持有的地图,每一行用若干个数字代表地图上对应行的地形.第1行描述了地图最北的那一排土地;最后一行描述的则是最南面的.相邻的数字所对应的区域是相邻的.如果地图的宽小于或等于40,那每一行数字恰好对应了地图上的一排土地.没有哪一行描述的区域分布在两个不同的行里.
地图上的数字所对应的地形:
0:贝茜可以通过的空地
1:由于各种原因而不可通行的区域
2:贝茜现在所在的位置
3:骑士们的位置
4:长着贝茜需要的灌木的土地

Output

输出一个正整数D,即贝茜最少要花多少天才能完成骑士们给的任务.

Sample Input

8 4
4 1 0 0 0 0 1 0
0 0 0 1 0 1 0 0
0 2 1 1 3 0 4 0
0 0 0 4 1 1 1 0

INPUT DETAILS:

Width=8, height=4. Bessie starts on the third row, only a few squares away
from the Knights.

Sample Output

11

HINT

这片森林的长为8,宽为4.贝茜的起始位置在第3行,离骑士们不远.

贝茜可以按这样的路线完成骑士的任务:北,西,北,南,东,东,北,东,东,南,南.她在森林的西北角得到一株她需要的灌木,然后绕过障碍把它交给在东南方的骑士.

前排提醒:bzoj上题目翻译有误,不存在一行只会有最多40个字符, 还害得我WA了一发。
题目很简单,是很裸的bfs。从2出发,记录在不经过3的路线中到达每个4的时间,再从3出发记录不经过2的路线中到达每个4的时间,最后能被两条路线共同经过的4中两段时间加起来最小的就是答案了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,m,ans=99999999;
int a[1005][1050];
int sx,sy,ex,ey;
bool vis[1005][1050];
int fx[4]={1,-1,0,0};
int fy[4]={0,0,-1,1};
int dis[1005][1050],dis2[1005][1050];
struct node{int x,y;
};
void bfs1(int s,int t)
{queue<node> q;memset(vis,0,sizeof(vis));memset(dis,-1,sizeof(dis));q.push((node){s,t});vis[s][t]=1;dis[s][t]=0;while(!q.empty()){node now=q.front();q.pop();for(int i=0;i<4;i++){node nex;nex.x=now.x+fx[i],nex.y=now.y+fy[i];if(nex.x<1 || nex.x>n || nex.y<1 || nex.y>m || a[nex.x][nex.y]==1 || a[nex.x][nex.y]==3 || vis[nex.x][nex.y]==1)continue;dis[nex.x][nex.y]=dis[now.x][now.y]+1;vis[nex.x][nex.y]=1;q.push(nex);}}
}
void bfs2(int s,int t)
{queue<node> q;memset(vis,0,sizeof(vis));memset(dis2,-1,sizeof(dis2));q.push((node){s,t});vis[s][t]=1;dis2[s][t]=0;while(!q.empty()){node now=q.front();q.pop();for(int i=0;i<4;i++){node nex;nex.x=now.x+fx[i],nex.y=now.y+fy[i];if(nex.x<1 || nex.x>n || nex.y<1 || nex.y>m || a[nex.x][nex.y]==1 || a[nex.x][nex.y]==2 || vis[nex.x][nex.y]==1)continue;dis2[nex.x][nex.y]=dis2[now.x][now.y]+1;vis[nex.x][nex.y]=1;q.push(nex);}}
}
int main()
{scanf("%d%d",&n,&m);swap(n,m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);if(a[i][j]==2)sx=i,sy=j;if(a[i][j]==3)ex=i,ey=j;}bfs1(sx,sy);bfs2(ex,ey);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(a[i][j]==4){if(dis[i][j]==-1 || dis2[i][j]==-1)continue;ans=min(ans,dis[i][j]+dis2[i][j]);}}cout<<ans<<endl;return 0;
}

bzoj1671 Knights of Ni 骑士 BFS相关推荐

  1. bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士(BFS)

    1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 416  Solved: 26 ...

  2. [题解] Knights of Ni 骑士 C++

    Knights of Ni 骑士 题目 Description Input Output Sample Input Sample Output 思路 代码 题目 Description 给出一张W*H ...

  3. 1671: [Usaco2005 Dec]Knights of Ni 骑士

    1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 351  Solved: 22 ...

  4. bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士

    题目链接 题目背景: 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为了能安全地离开,贝茜不得不按照骑士们的要求,在森林寻找一种特殊的灌木 ...

  5. P5195 [USACO05DEC]Knights of Ni S

    知识点:广度优先搜索 难度:4 这个题应该是一个裸的广搜,但是看洛谷的题解,什么分层图,双向广搜之类的比比皆是,我觉得一道题还是要用最简单的方法解决比较好,毕竟才看到紫书第6章,进阶指南一章也没看, ...

  6. 【from zero to zero】noip2017

    from zero to zero 洛谷首页的倒计时不知道什么时候就变成了六字开头. 到底还是太弱了. 生病又拖了很多的时间. 听了很多的算法,自己写起来却非常困难. 也许要在累倒前做一些事情呢. 从 ...

  7. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  8. HDOJ题目分类大全

    版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...

  9. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

最新文章

  1. 21天让你成为Horizon View高手—Day20:证书管理
  2. C++中const迭代器 和 const_iterator的区别
  3. python实现词语相似度计算分析_相似度计算的方法及Python实现
  4. springmvc异常处理器
  5. windows c++ 内存映射大文件问题记录
  6. 关于MySql5“data too long for column”问题的探解
  7. Flash as3.0 保存MovieClip运动轨迹到json文件
  8. 搭建Typescript+React项目模板(5) --- 团队规范
  9. 随机抽题软件C语言,ppt VBA 实现随机抽题
  10. 编码的奥秘:电筒密谈
  11. GD32F103RC官方移植IAR
  12. linux系统微信怎么放桌面上,Linux 安装微信/QQ
  13. MATLAB求最大值max函数
  14. 重建oracle inventory
  15. 让极客精神成为自然:DefCon China看这一篇就够了
  16. Java自定义导出列_后台生成EXCEL文档,自定义列
  17. DB-Engines发布了2017年9月数据库排名。
  18. 在VMware中安装红帽Linux系统
  19. MVC框架的学习总结
  20. C++ Reference: Standard C++ Library reference: C Library: cstdio: clearerr

热门文章

  1. 技嘉显卡性能测试软件,理论性能测试_技嘉 AORUS GTX 1070 Gaming Box_显卡评测-中关村在线...
  2. 第三方支付-支付宝支付简易DEMO
  3. i春秋之SQL(详细WP)
  4. 以患者到医院就诊为背景,使用列表对象(ArrayList)和泛型机制实现就诊排队叫号系统
  5. 2021年茶艺师(中级)考试技巧及茶艺师(中级)模拟考试题库
  6. 【黄敏聪|自由设计师系列1-基础篇】教程之二 |自由设计师走向成功最佳策略是什么?
  7. [nlp] 小傻学数据预处理
  8. 百度搜狗SEO快速排名模拟点击工具-提升关键词排名
  9. 刚毕业做真实运维简历模板参考
  10. 即刻智能|MES生产制造管理系统助力企业实现“智慧工厂”