最近开始刷算法题,发现迷宫这道网上很多代码对于我这种新人都很难看懂,就把自己想了许久的解法传到博客了,有心情会
补上想法。
#include<iostream>
#include<cstring>
using namespace std;
int maze[10][10];
int visited[10][10];
const int MAXN = 100;
struct Node
{
int c,r;//当前的行,列坐标
int f;// 记录父节点在队列中的下标
Node(int cc, int rr, int ff):c(cc),r(rr),f(ff){}
Node():c(0),r(0),f(0){}
};
Node myQueue[MAXN];
int head = 0;
int tail = 0;
// 入栈
void myEnque(Node x)
{
myQueue[tail] = x;
tail = (tail+1)%MAXN;// 形成循环队列
}
//判断是否为空
int isEmpty()
{
if(head == tail) return 1;
return 0;
}
void print(int n, int m)
{
cout << "(" << myQueue[n].c << ", " << myQueue[n].r << ")" << endl;
if(n <= m) print(n+1, m);
}
void Bfs(Node m)
{
if(m.c == 4 && m.r == 4)
{
print(0,m.f);
return;
}
// 向右走
if(m.r < 4 && !maze[m.c][m.r+1] && !visited[m.c][m.r+1])
{
myEnque(Node(m.c,m.r+1,m.f+1));
visited[m.c][m.r+1]=1;
Bfs(Node(m.c,m.r+1,m.f+1));
}
// 向下走
if(m.c < 4 && !maze[m.c+1][m.r] && !visited[m.c+1][m.r])
{
myEnque(Node(m.c+1,m.r,m.f+1));
visited[m.c+1][m.r] = 1;
Bfs(Node(m.c+1,m.r,m.f+1));
}
// 往回向左走
if(m.r > 1 && m.r-1 >= 0 && !maze[m.c][m.r-1] && !visited[m.c][m.r-1])
{
visited[m.c][m.r-1]=1;
myEnque(Node(m.c,m.r-1,m.f+1));
Bfs(Node(m.c,m.r-1,m.f));
}
// 向上走
if(m.c-1 >= 0 && m.c-1 >= 0 && !maze[m.c-1][m.r] && !visited[m.c-1][m.r])
{
myEnque(Node(m.c-1,m.r,m.f+1));
visited[m.c-1][m.r]=1;
Bfs(Node(m.c-1,m.r,m.f));
}
return;
}
int main()
{
memset(visited,0,sizeof(visited));
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 5; ++j)
cin >> maze[i][j];
Node start = Node(0,0,-1);
myEnque(start);
Bfs(start);
return 0;
}
原文:https://www.cnblogs.com/ApStar/p/13369909.html