最少步数(dfs + bfs +bfs优化)
最少步数
- 描述
-
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。 - 输出
- 输出最少走几步。
- 样例输入
-
2
3 1 5 7
3 1 6 7 - 样例输出
-
12
11题解:dfs带回溯;找最小步数;还可以用广搜BFS,以及用优先队列优化;
- 代码:
-
#include<stdio.h>
#include<string.h>
#define MIN(x,y) x<y?x:y
const int MAXN=;
const int INF=<<;
int map[MAXN][MAXN]={
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,}
};
int disx[]={,-,,};
int disy[]={,,-,};
int a,b,c,d,min;
void dfs(int x,int y,int t){int nx,ny;
if(x==c&&y==d){
min=MIN(min,t);
return ;
}
for(int i=;i<;i++){
nx=x+disx[i];ny=y+disy[i];
if(t+<min&&!map[nx][ny]){
map[nx][ny]=;
dfs(nx,ny,t+);
map[nx][ny]=;
}
}
return ;
}
int main(){
int T;
/* for(int x=0;x<9;x++){
for(int y=0;y<9;y++)printf("%d ",map[x][y]);
puts("");
}*/
scanf("%d",&T);
while(T--){min=INF;
scanf("%d%d%d%d",&a,&b,&c,&d);
map[a][b]=;
dfs(a,b,);
map[a][b]=;
printf("%d\n",min);
}
return ;}广搜:
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
const int INF=0xfffffff;
int disx[]={,,-,};
int disy[]={,,,-};
struct Node{
int nx,ny,step;
};
queue<Node>dl;
Node a,b;
int x,y,ex,ey,T,mi;
int map[][];
void bfs(){
map[x][y]=;
a.nx=x;a.ny=y;a.step=;
dl.push(a);
while(!dl.empty()){
a=dl.front();
dl.pop();
map[a.nx][a.ny]=;
if(a.nx==ex&&a.ny==ey){
if(a.step<mi)mi=a.step;
map[ex][ey]=;
}
for(int i=;i<;i++){
b.nx=a.nx+disx[i];b.ny=a.ny+disy[i];b.step=a.step+;
if(!map[b.nx][b.ny]&&b.step<=mi&&b.nx>=&&b.ny>=&&a.nx<&&b.ny<)dl.push(b);
}
}
}
int main(){
scanf("%d",&T);
while(T--){int m[][]={
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,}
};
memcpy((int *)map,(int *)m,sizeof(m[][])*);
scanf("%d%d%d%d",&x,&y,&ex,&ey);
mi=INF;
bfs();
printf("%d\n",mi);
}
return ;
}#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
const int INF=0xfffffff;
int disx[]={,,-,};
int disy[]={,,,-};
struct Node{
int nx,ny,step;
friend bool operator < (Node a,Node b){
return a.step > b.step;
}
};
priority_queue<Node>dl;
Node a,b;
int x,y,ex,ey,T,mi;
int map[][];
void bfs(){
map[x][y]=;
a.nx=x;a.ny=y;a.step=;
dl.push(a);
while(!dl.empty()){
a=dl.top();
dl.pop();
map[a.nx][a.ny]=;
if(a.nx==ex&&a.ny==ey){
if(a.step<mi)mi=a.step;
map[ex][ey]=;
}
for(int i=;i<;i++){
b.nx=a.nx+disx[i];b.ny=a.ny+disy[i];b.step=a.step+;
if(!map[b.nx][b.ny]&&b.step<=mi&&b.nx>=&&b.ny>=&&a.nx<&&b.ny<)dl.push(b);
}
}
}
int main(){
scanf("%d",&T);
while(T--){int m[][]={
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,},
{,,,,,,,,}
};
memcpy((int *)map,(int *)m,sizeof(m[][])*);
scanf("%d%d%d%d",&x,&y,&ex,&ey);
mi=INF;
bfs();
printf("%d\n",mi);
}
return ;
}
最少步数(dfs + bfs +bfs优化)的更多相关文章
- 最少步数(bfs)
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- 最少步数(bfs)
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- dfs和bfs的区别
详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...
- [转帖]dfs和bfs
dfs和bfs https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜 ...
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)
图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...
- 【DFS与BFS】洛谷 P1135 奇怪的电梯
题目:奇怪的电梯 - 洛谷 (luogu.com.cn) 因为此题数据范围较小,有dfs及bfs等多种做法. DFS 比较正常的dfs,注意vis数组一定要回溯,不然会漏情况 例如这个数据 11 1 ...
- Clone Graph leetcode java(DFS and BFS 基础)
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
随机推荐
- 【剑指offer】面试题23:从上往下打印二叉树
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: bfs,队列. 注意,队列最后不要忘了pop(). 代码: /* struct TreeNode { int val; stru ...
- javadoc 生成帮助文档时,注意以下几点
参考:http://www.w3school.com.cn/tags/tag_pre.asp javadoc 生成帮助文档时,注意以下几点: 1.函数功能描述的结尾一定要有句号,英文句号或中文句号均可 ...
- 文件系统、mkdir、touch、nano、cp笔记
文件系统:rootfs: 根文件系统 FHS:Linux发行版目录层级遵循协议 /boot: 系统启动相关的文件,如内核.initrd,以及grub(bootloader)引导加载器/dev: 设备文 ...
- C++实现20个设计模式
http://c.chinaitlab.com/special/sjms/Index.html 一个月下来,把常见的20个设计模式好好复习并且逐个用C++实现了一遍,收获还是很大的,很多东西看上去明白 ...
- .NET 基础串讲
C#基础 .NET介绍 计算机发展史 第一代语言:机器语言 0101 第二代语言:汇编语言, 用一些简洁的英文字母.符号串来替代一个特定指令的二进制串 第三代语言:接近于数学语言或人的自然语言,同时 ...
- sql必知必会(第四版) 学习笔记二 视图
本书用到的几个表的建表sql语句如下: --销售产品供应商 CREATE TABLE Vendors ( vend_id varchar(20) not null, vend_name varchar ...
- django学习笔记二:一个项目多个App项目搭建
django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...
- AFNetworking自我总结
AFNetworking 简介 目前国内开发网络应用使用最多的第三方框架 是专为 Mac OS & iOS 设计的一套网络框架 对 NSURLConnection 和 NSURLSession ...
- ProxyCreationEnabled 和 LazyLoadingEnabled 的关系
我们会使用这两个设置来决定是否加载导航属性.默认情况这两个值都是true的,也就是说会以延迟加载的方式加载导航属性,也就是当我们访问导航属性的时候才会去查数据库获取导航属性的数据.db.Configu ...
- Hibernate学习——映射关系
学习记录 O(∩_∩)O . 如果你恰巧路过,希望你能停下脚步瞧一瞧,不足之处望指出,感激不尽~ 使用工具: 1.eclipse 2.hibernate压缩包(hibernate_4.3.11) ...