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> ...
随机推荐
- jdk环境
安装方式一 jdk环境 干净的环境 将tar包解压到 /usr/local下 版本为jdk-8u211-linux-x64.tar.gz 路径为/usr/local/jdk1.8.0_211 /u ...
- C++中数字与字符串之间的转换 scanf string总结(复习必读)
1 string的scanf读入操作 C++里面控制台输入直接使用cin操作就可以了:或者getline(istringstream,string); 字符和数字加减就是字符的ASCII码和数字直接加 ...
- Day8 - D - Multiplication Table CodeForces - 448D
Bizon the Champion isn't just charming, he also is very smart. While some of us were learning the mu ...
- 使用Spring Data JPA的Spring Boot
本文教你开始使用Spring Data JPA.来自优锐课JAVA架构专业讲师精心整理. 欢迎使用带有Spring Data JPA的Spring Boot教程!在本教程中,我们将看到Spring D ...
- Apache http 包中的常量
org.apache.* org.apache.http.Consts public static final int CR 13 public static final int HT 9 publi ...
- leetcode1261 Find Elements in a Contaminated Binary Tree
""" Given a binary tree with the following rules: root.val == 0 If treeNode.val == x ...
- Java 类加载器(ClassLoader)
类加载器 ClassLoader 什么是类加载器? 通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现, 以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代 ...
- Spring入门之四-------SpringIoC之其他知识点
一.懒加载 public class Bean1 { public Bean1() { System.out.println(this.getClass().getSimpleName() + &qu ...
- 微信小程序实现左滑删除效果(原生/uni-app)
实现效果 列表中侧滑删除 删除不同时存在 scrollview上下滑动与侧滑删除不影响 uni-app实现 html部分 <template> <scroll-view :scrol ...
- springcloud--zuul(过滤器)
在zuul添加过滤器 新建类继承ZuulFilter类. public class MyFilter extends ZuulFilter{ //是否需要过滤 @Override public boo ...