洛谷 题解 P1605 【迷宫】

洛谷 题解 P1605 【迷宫】

题目

深搜经典例题,必须掌握!

简单说一下深搜,就是一条路走到底,发现不行了就往回走,再走另一条路,直到不能走为止

深搜做迷宫有三大题型:能不能走;怎么走;路径数量,显然这题考的就是路径数量

那怎么做呢? 老样子,一个一个部分来讲解

一、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;
}

走过路过的点个赞吧!

你可能感兴趣的:(洛谷 题解 P1605 【迷宫】)