一、题目链接
洛谷 P1605 迷宫
进阶题目:洛谷 P1238 走迷宫【搜索】【DFS】
二、题目分析
(一)算法标签
搜索 DFS BFS
(二)解题思路
详细了解搜索类题目(DFS、BFS),请移步DFS BFS 搜索题目归纳
三、AC代码
解法一(DFS):
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10;
int n, m, t;
int g[N][N];
bool st[N][N];
int sx, sy, fx, fy;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int ans;
// 第一种写法
void dfs(int x, int y)
{
if (x == fx && y == fy)
{
ans ++ ;
return;
}
st[x][y] = true;
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i];
if (a < 1 || a > n || b < 1 || b > m) continue;
if (!st[a][b] && g[a][b] == 0)
{
st[a][b] = true;
dfs(a, b);
st[a][b] = false;
}
}
}
// 第二种写法
void dfs(int x, int y)
{
if(x>n || y>m || x<1 || y<1) //检查越界
return;
if(g[x][y]==1) //检查是否能走
return;
if(x==fx && y==fy) //是否到达终点
{//要先检查能走 再检查是否到达终点 终点有可能是墙壁
ans++;
return;
}
g[x][y] = 1; //标记已经走过 不能走了
for(int i=0; i<4; i++) //四种移动方式
dfs(x+dx[i], y+dy[i]);
g[x][y] = 0; //取消标记
}
int main()
{
cin >> n >> m >> t;
cin >> sx >> sy >> fx >> fy;
memset(g, 0, sizeof g);
while (t -- )
{
int x, y;
cin >> x >> y;
g[x][y] = 1;
}
dfs(sx, sy);
cout << ans << endl;
return 0;
}
解法二(BFS):
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 6;
int n, m, t;
int g[N][N];
int sx, sy, fx, fy;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int ans;
struct Point{
int x, y;
bool used[N][N];
};
void bfs(Point start)
{
start.used[start.x][start.y] = true; // 标记走过的路径
queue<Point> q;
q.push(start);
while (!q.empty())
{
auto t = q.front();
q.pop();
// printf("(%d,%d) ", t.x, t.y);
for(int i = 0;i < 4; i ++ )
{
int a = t.x + dx[i], b = t.y + dy[i];
if(t.used[a][b] || g[a][b] == 1 || a < 1 || b < 1 || a > n || b > m)
continue; //如果这里走过,或者这里是障碍,或者这里是墙壁,那么这里就不能走。
if(a == fx && b == fy)
{
ans++; //如果这里是终点,那么答案加一
continue; //如果是break就会WA
}
Point p = {a, b};
memcpy(p.used, t.used, sizeof(t.used));
p.used[t.x][t.y] = true; //这里的操作都是为了标记路径
q.push(p);
}
}
}
int main()
{
cin >> n >> m >> t;
cin >> sx >> sy >> fx >> fy;
while (t -- )
{
int x, y;
cin >> x >> y;
g[x][y] = 1;
}
Point start = {sx, sy};
bfs(start);
cout << ans << endl;
return 0;
}