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. 自定义控件学习,优秀网站推荐
  2. 使用用户名/密码和Servlet安全性保护WebSockets
  3. oracle多条sql语句常量,如何在Oracle中一次执行多条sql语句
  4. @data 重写set方法_C#中的类、方法和属性
  5. 【转载保存】在python中如何用word2vec来计算句子的相似度
  6. linux 接口 bridge vlan bonding,KVM配置BOND,BRIDGE,VLAN
  7. Java的核心思想(发展方向)
  8. echarts里面的参数解释_SPMSM控制:传统PI速度环参数的整定
  9. TFRecord —— tensorflow 下的统一数据存储格式
  10. mysql max 函数的陷阱
  11. item_review - 获得淘宝商品评论
  12. 基于竞争的MAC协议
  13. 达梦(DM)数据库常见问题详解
  14. Android——支持图片加视频无限轮播的banner
  15. 有限元方法之三角形元任意阶的Lagrange型形状函数
  16. Java中split的用法
  17. 任正非圣诞发表文章:我在生活所迫时创立华为
  18. phpems 修改模板_phpems二次开发手册
  19. Dart语言(一)--基础语法
  20. Bot 崛起:你的企业需要考虑这11个重要问题

热门文章

  1. 重走青春路……还是因到了“原点”……
  2. 逃离天坑之后——谈谈技术路线该怎么走
  3. R-Studio如何恢复被格式化移动硬盘数据
  4. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
  5. 读书笔记_007《青鸟》
  6. linux命令行下读取u盘内容_Linux拷贝U盘文件(命令行)
  7. 不懂时间管理的本质,你只会越来越忙
  8. IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)
  9. SpringMVC 程序开发
  10. 【HFSS】有限大阵列FA-DDM仿真