DFS:
#include <iostream>
using namespace std;
int maze[80][80];
int v[80][80];
int dx[] = { 0,1,0,-1 }; //右、下、左、上
int dy[] = { 1,0,-1,0 };
int endx, endy;
int startx, starty;
int step=0;
void dfs(int x, int y)
{
if (x == endx && y == endy)
{
cout << step << endl;
return;
}
for (int i = 0; i <= 3; i++)
{
if (maze[x + dx[i]][y + dy[i]] == 1 && v[x + dx[i]][y + dy[i]] == 0)
{
v[x + dx[i]][y + dy[i]] = 1;
step++;
dfs(x + dx[i], y + dy[i]);
v[x + dx[i]][y + dy[i]] = 0; //回溯过程中要把对应位置0表示没走过,且步数减1
step--;
}
}
return;
}
/*第一行:迷宫行数、列数
* 第二行到倒数第二行:迷宫
* 最后一行:起始点和终点
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
*/
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> maze[i][j];
}
}
cin >> startx >> starty;
cin >> endx >> endy;
dfs(startx, starty);
return 0;
}
BFS:
#include <iostream>
#include <queue>
using namespace std;
int maze[80][80];
int v[80][80];
int dx[] = { 0,1,0,-1 }; //右、下、左、上
int dy[] = { 1,0,-1,0 };
int endx, endy;
int startx, starty;
struct point
{
int x;
int y;
int step;
};
queue<point> q;
void bfs(int x,int y)
{
point p;
p.x = x;
p.y = y;
p.step = 0;
v[x][y] = 1;
q.push(p);
while (!q.empty())
{
if (q.front().x == endx && q.front().y == endy)
{
cout << q.front().step << endl;
break;
}
for (int i = 0; i <= 3; i++)
{
if (maze[x + dx[i]][y + dy[i]] == 1 && v[x + dx[i]][y + dy[i]] == 0)
{
v[x + dx[i]][y + dy[i]] = 1;
p.x = x+dx[i];
p.y = y+dy[i];
p.step = q.front().step + 1;
q.push(p);
}
}
q.pop();
//更新x和y
x = q.front().x;
y = q.front().y;
}
if (q.empty())
{
cout << -1 << endl;
}
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> maze[i][j];
}
}
cin >> startx >> starty;
cin >> endx >> endy;
bfs(startx, starty);
return 0;
}