题目
深搜经典例题,必须掌握!
简单说一下深搜,就是一条路走到底,发现不行了就往回走,再走另一条路,直到不能走为止
深搜做迷宫有三大题型:能不能走;怎么走;路径数量,显然这题考的就是路径数量
那怎么做呢? 老样子,一个一个部分来讲解
一、main 函数部分
① 把已知条件转化为一个二维数组
cin >> n >> m >> t >> sx >> sy >> fx >> fy;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
maze[i][j] = '.';
}
}
maze[sx][sy] = 'S';
maze[fx][fy] = 'T';
for (int i = 0; i < t; i++){
int x, y;
cin >> x >> y;
maze[x][y] = '*';
}
②深搜就完事了
dfs(sx, sy);
cout << ans << endl;
return 0;
注:ans是全局变量,指的是路径数目
二、dfs数组
① 判断临界条件:如果到达终点就算完事
if (maze[x][y] == 'T'){
ans++;
return;
}
② 建立一个方位数组并进行循环
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
for (int i = 0; i < 4; i++){
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (!vis[tx][ty] && maze[tx][ty] != '*' && in(tx, ty)){
dfs(tx, ty);
}
}
③ 有没有发现前面那段代码中有一个in函数,这只是一个用来判断是否越界的函数,很容易写
bool in(int x, int y){
return x >= 1 && x <= n && y >= 1 && y <= m;
}
④ dfs函数完整代码
void dfs(int x, int y){
if (maze[x][y] == 'T'){
ans++;
return;
}
vis[x][y] = true;
for (int i = 0; i < 4; i++){
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (!vis[tx][ty] && maze[tx][ty] != '*' && in(tx, ty)){
dfs(tx, ty);
}
}
vis[x][y] = false;
}
重点:vis[x][y] = false不能省略,只有求是否可以走的时候才能不写
三、完整代码
#include
#include
using namespace std;
char maze[10][10];
int vis[10][10];
int n, m, sx, sy, fx, fy, t, ans;
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
bool in(int x, int y){
return x >= 1 && x <= n && y >= 1 && y <= m;
}
void dfs(int x, int y){
if (maze[x][y] == 'T'){
ans++;
return;
}
vis[x][y] = true;
for (int i = 0; i < 4; i++){
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (!vis[tx][ty] && maze[tx][ty] != '*' && in(tx, ty)){
dfs(tx, ty);
}
}
vis[x][y] = false;
}
int main(){
cin >> n >> m >> t >> sx >> sy >> fx >> fy;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
maze[i][j] = '.';
}
}
maze[sx][sy] = 'S';
maze[fx][fy] = 'T';
for (int i = 0; i < t; i++){
int x, y;
cin >> x >> y;
maze[x][y] = '*';
}
dfs(sx, sy);
cout << ans << endl;
return 0;
}
走过路过的点个赞吧!