bfs--P1301 魔鬼之城
求最小步数,bfs求解。因为题目要求可以走八个方向(上下左右和对角线),所以两个方位数组来找八个方向
int dirx[9]={0,0,1,1,1,0,-1,-1,-1};
int diry[9]={0,-1,-1,0,1,1,1,0,-1};
开一个结构体,表示当前节点的横纵坐标、步数、和它从哪个方向来。
}nowid,nextid;
vis数组记录当前节点是否向某一方向走过 vis[x][y][way]x表示横坐标,y表示纵坐标,way表示方向(方位数组的角标)
从当前节点,可以向某一方向直接跨越当前节点所表示节点个数,所以当前节点能走到的位置为
nextid.x=nowid.x+dirx[i]*map[nowid.x][nowid.y];
nextid.y=nowid.y+diry[i]*map[nowid.x][nowid.y];
判断下个位置是否在当前方向走过,是否越界,若位置合理,步数+1,标记走过,并记录方向(因为两次不能走同个方向),剩下的就和bfs的板子一模一样了
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
int n,m;
][];
][][];
;
]={,,,,,,-,-,-};
]={,-,-,,,,,,-};
struct node{
int x,y,step,way;
}nowid,nextid;
void bfs(int x,int y){
queue<node> q;
nowid.x=x,nowid.y=y,nowid.step=,nowid.way=-;
q.push(nowid);
while (!q.empty()){
nowid=q.front();q.pop();
if (nowid.x==m&&nowid.y==n){
flag=;
printf ("%d\n",nowid.step);
return;
}
nextid=nowid;
;i <= ;i++){
if (nowid.way!=i){
nextid.x=nowid.x+dirx[i]*map[nowid.x][nowid.y];
nextid.y=nowid.y+diry[i]*map[nowid.x][nowid.y];
&&nextid.x<=m&&nextid.y>=&&nextid.y<=n&&!vis[nextid.x][nextid.y][i]){
vis[nextid.x][nextid.y][i]=;
nextid.step=nowid.step+;
nextid.way=i;
q.push(nextid);
}
}
}
}
}
int main(){
scanf ("%d%d",&n,&m);
;i <= m;i++)
;j <= n;j++)
scanf ("%d",&map[i][j]);
bfs(,);
if (!flag) cout<<"NEVER"<<endl;
;
}
bfs--P1301 魔鬼之城的更多相关文章
- 洛谷 P1301 魔鬼之城
P1301 魔鬼之城 题目描述 在一个被分割为N*M个正方形房间的矩形魔鬼之城中,一个探险者必须遵循下列规则才能跳跃行动.他必须从(1, 1)进入,从(N, M)走出:在每一房间的墙壁上都写了一个魔法 ...
- 洛谷P1301 魔鬼之城 题解
想找原题请点击这里:传送门 题目描述 在一个被分割为N*M个正方形房间的矩形魔鬼之城中,一个探险者必须遵循下列规则才能跳跃行动.他必须从(, )进入,从(N, M)走出:在每一房间的墙壁上都写了一个魔 ...
- 洛谷P1301 魔鬼之城
传送门啦 一道广度优先搜索的题目. 结构体含义: struct node{ int x,y,dir;//坐标,方向 int step;//当前步数 }; 方向的标号受上面定义的 $ dx[ ] , d ...
- vijos p1777 引水入城(bfs+贪心)
引水入城 描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使 ...
- NOIP2010_T4_引水入城 bfs+贪心
在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行 M 列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度.为了使 ...
- 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远 ...
- luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)
P1514 引水入城 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
- NOIP2010引水入城[BFS DFS 贪心]
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- noip2010 引水入城 bfs+贪心
如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...
随机推荐
- JAVA虚拟机:内存回收策略及算法
java虚拟机中的程序计数器区.虚拟机栈区.本地方法栈区3个区域是随着线程的创建而创建,随着线程的结束而结束时,内存自然得到回收,所以这三个区域不需要过多考虑内存的回收问题. java虚拟机中的方法区 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 图片:缩略图功能
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:快速浮动
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- loadrunner 手动添加关联
以loadrunner自带的订票系统为例 1.录制两次订票流程 2.比较两次不同点(Tools ->Compare with script) 3.找到服务器返回的动态值 4.回到Script模式 ...
- Uboot 命令行 介绍
背景 基本上,本文转载自:<ARM板移植Linux系统启动(五)Uboot命令行> 上次说到uboot的启动方式,最后会使用autoboot(自主模式)尝试引导kernel,如果失败或者被 ...
- Fiddler里面AutoResponder和mock用法
AutoResponder 1.找到对应图片请求的链接 2.操作步骤如下图: mock 使用场景:上一步骤模块没有完成,但是下一步模块完成了,需要使用到快速模拟,主要使用的地方就是测试接口
- Oracle修改密码
1. 登陆oracle sqlplus '/as sysdba' 2. 修改密码 ALTER USER 用户名IDENTIFIED BY 要修改的密码 ; 3.解锁 alter user 用户名 ac ...
- 单选与多选与label
单选radio和多选checkbox是用name属性关联的 相同的name就相当于同一道题 <input type="radio" name="radio" ...
- 解析underscore中的debounce
先奉上源码 取自Underscore.js 1.9.1的debounce _.debounce = function(func, wait, immediate) { var timeout, res ...
- EditText标签的使用
前文: 介绍EditText的使用,这个是文本输入控件,用来输入文本内容 使用: EditText继承TextView所以TextView的东西EditText都可以使用 text:显示文本 text ...