BFS简单入门
最近才把之前放下的数据结构捡起来,就以宽搜来开头吧
摆烂两个月,我是小丑广度优先搜索(Breadth First Search)
介绍
就不细说了,详见
总结
一般来说,求从一个状态到另一个状态所需的最少变换次数,使用BFS
迷宫
题目
一个入口,一个出口,有边界,有墙阻挡,求最短路径
这里就以6x6的地图大小了
用**#表示墙,0**为可走,黄色表示起点和终点
输入地图、起点坐标、终点坐标
Sample Input
1
2
3
4
5
6
7#0###
#0#0#
0000#
0#0##
0000#
###0#
1 3 6 5Sample Output
1
7
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using namespace std;
/*
##0###
##0#0#
#0000#
#0#0##
#0000#
####0#
*/
char ditu[N][N];
int flag[N][N] = {0}; //记录状态
typedef struct
{
int x;
int y;
int step;
}POINT;
queue<POINT> q;//队列
int go[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};//上下左右
int start_x,start_y,end_x,end_y;
int res;
int area=6;//地图大小 就按6*6了
void bfs()
{
//先把初始状态 入队 再 出队
POINT startp;
startp.x = start_x;
startp.y = start_y;
startp.step = 0;
q.push(startp);
while(!q.empty())//队列不为空一直执行
{
POINT headp = q.front(); //取当前队列的头给临时变量
q.pop();//出队 拓展
for(int i=0; i<4; i++)
{
int new_x = headp.x + go[i][0];
int new_y = headp.y + go[i][1];//上下左右拓展
if(flag[new_x][new_y] || new_x < 1 || new_y < 1 || new_x > area || new_y > area || ditu[new_x][new_y]) //是否到达过 边界 墙
continue;
flag[new_x][new_y] = 1;
POINT joinp;
joinp.x = new_x;
joinp.y = new_y;
joinp.step = headp.step + 1;
if(new_x == end_x && new_y == end_y)//判断是否结束
{
res = joinp.step;
}
q.push(joinp);//入队 继续
}
}
}
int main()
{
char trs;//临时变量转换
for(int i=1; i<=area; i++)
{
for(int j=1; j<=area; j++)
{
cin >> trs;
if(trs == '#')
ditu[i][j] = 1;
else
ditu[i][j] = 0;
}
}
cin >> start_x >> start_y >> end_x >> end_y;
bfs();
cout << res;
return 0;
}
奇怪的电梯
https://www.luogu.com.cn/problem/P1135
题目描述
输入格式
输出格式
一行,即最少按键次数,若无法到达,则输出 -1
。
样例输入
1 | 5 1 5 |
样例输出
1 | 3 |
提示
参考代码
1 |
|
不敢摆了,近期会写bfs进阶和dfs入门
救救孩子吧,赶不上校队选拔和蓝桥杯了
此文章版权归shuomc所有,如有转载,请注明来自原作者
评论