文章目录
一. DFS与BFS概述(一). DFS与BFS遍历过程的区别Ⅰ. DFSⅡ. BFS
(二). DFS与BFS区别(三). DFS与BFS的应用场景
二. DFS例题—n-皇后问题题目C++代码实现
三. BFS例题—走迷宫题目C++代码实现
一. DFS与BFS概述
(一). DFS与BFS遍历过程的区别
Ⅰ. DFS
从一个点开始遍历,一条道走到黑,真的无路可走时,回溯到上一步,此时若有另一条路,则继续走,若没有,继续回溯……直到所有的点全部遍历一遍以后结束。
Ⅱ. BFS
从一个点开始,一层一层的遍历。
(二). DFS与BFS区别
–数据结构空间最短性
DFSstackO(h)不具最短性BFSqueueO(2h)具有最短性
(三). DFS与BFS的应用场景
因为BFS是从根节点开始一层一层遍历的,那么搜索到的第一个答案一定是离根节点最近的点,所以BFS具有最短性,但是DFS不一定。因为BFS的最短性,所以题意是与最短路,最小参数有关时,可以使用BFS(边权都是1时才可以用BFS)。若题的思想比较奇怪或者对空间深度(及高度)要求高的可以使用DFS。
二. DFS例题—n-皇后问题
题目
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数n,请你输出所有的满足条件的棋子摆法。
输入格式 共一行,包含整数n。
输出格式 每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。
其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。
每个方案输出完成后,输出一个空行。
输出方案的顺序任意,只要不重复且没有遗漏即可。
数据范围 1≤n≤9 输入样例: 4 输出样例: .
C++代码实现
#include<iostream>
using namespace std
;
const int N
= 20;
char p
[N
][N
];
bool col
[N
], dg
[N
], udg
[N
];
int n
;
void dfs(int u
)
{
if(u
== n
)
{
for(int i
= 0; i
< n
; i
++) puts(p
[i
]);
puts("");
return ;
}
for(int i
= 0; i
< n
; i
++)
{
if(!col
[i
] && !dg
[u
+ i
] && !udg
[n
- u
+ i
])
{
p
[u
][i
] = 'Q';
col
[i
] = dg
[u
+ i
] = udg
[n
- u
+ i
] = true;
dfs(u
+ 1);
col
[i
] = dg
[u
+ i
] = udg
[n
- u
+ i
] = false;
p
[u
][i
] = '.';
}
}
}
int main()
{
cin
>> n
;
for(int i
= 0; i
< n
; i
++)
for(int j
= 0; j
< n
; j
++)
p
[i
][j
] = '.';
dfs(0);
return 0;
}
三. BFS例题—走迷宫
题目
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。
最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。
数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。
输入格式 第一行包含两个整数n和m。
接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。
输出格式 输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围 1≤n,m≤100
样例 输入样例: 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 输出样例: 8
C++代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std
;
typedef pair
<int, int> PII
;
const int N
= 110;
int dx
[4] = {-1, 0, 1, 0};
int dy
[4] = {0, 1, 0, -1};
int g
[N
][N
];
int d
[N
][N
];
PII q
[N
* N
];
int n
, m
;
int bfs()
{
int hh
= 0, tt
= 0;
q
[0] = {0, 0};
memset(d
, -1, sizeof d
);
d
[0][0] = 0;
while(hh
<= tt
)
{
auto t
= q
[hh
++];
for(int i
= 0; i
< 4; i
++)
{
int x
= t
.first
+ dx
[i
];
int y
= t
.second
+ dy
[i
];
if(x
>= 0 && x
< n
&& y
>= 0 && y
< m
&& g
[x
][y
] == 0 && d
[x
][y
] == -1)
{
d
[x
][y
] = d
[t
.first
][t
.second
] + 1;
q
[++ tt
] = {x
, y
};
}
}
}
return d
[n
-1][m
-1];
}
int main()
{
cin
>> n
>> m
;
for(int i
= 0; i
< n
; i
++)
for(int j
= 0; j
< m
; j
++)
cin
>> g
[i
][j
];
cout
<< bfs() << endl
;
return 0;
}