最少步数(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 ////////////////////////// ...
随机推荐
- vector迭代器失效的一种情形
使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例: 第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后 将原内存中的数据拷 ...
- python使用get在百度搜索并保存第一页搜索结果
python使用get在百度搜索并保存第一页搜索结果 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用在意我的感受 #coding:utf-8 import ur ...
- Unity扩展 四种Menu的区别
[MenuItem("Tools\AddColor")] : 在Unity菜单中添加一种快捷,执行public static方式 [AddComponentMenu(" ...
- Java Base64编码与图片互转
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- 9.5 在 C# 中使用 F# 库
9.5 在 C# 中使用 F# 库 像 C# 一样,F# 也是一种静态类型的语言,就是说,编译器知道每一个值的类型,以及类方法和属性的签名.对于与 C# 的互操作性来说.这是很重要的,由于,编译器能够 ...
- Unity 之圆环算法
首先我们要明白圆环生成的原理,其实说白了并不是圆环,而是圆.因为我们使用的预制物体时Cube(物体本身是有大小的)难免会有发生实物的折叠看起来给人的感觉是圆环而已. 1.1 几何中我们要画一个圆,因为 ...
- [Python笔记][第一章Python基础]
2016/1/27学习内容 第一章 Python基础 Python内置函数 见Python内置函数.md del命令 显式删除操作,列表中也可以使用. 基本输入输出 input() 读入进来永远是字符 ...
- 【SQL】大杂烩
--------------------------------- 索引 --------------------------------- 语法: CREATE [索引类型] INDEX 索引名称 ...
- Extjs 6 MVC开发模式(一)
1.Extjs就绪函数 1)导入Extjs的CSS <link rel="stylesheet" type="text/css" href="r ...
- Arrays.copyof
public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System. ...