题解 | #迷宫问题#参考了别人的
迷宫问题
http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
广搜出路径,深搜出结果,深搜从终点开始递归找爹,起点就是递归终止条件
/*定义一个二维数组 N*M ,如 5 × 5 数组下所示:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,
只能横着走或竖着走,不能斜着走,要求编程序找出从左上
角到右下角的路线。入口点为[0,0],既第一格是可以走的路。
*/
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
typedef struct pos
{
int x;
int y;
}pos;
pos father[10][10];
void BFS(int a[][10],int n,int m,pos p)//二维数组做形参第二维或更高维的大小不可以省略
{
int visited[10][10]={0};
pos v;
pos W,A,S,D;
queue<pos>q;
q.push(p);
visited[p.x][p.y]=2;
while(!q.empty())
{
v=q.front();
W.x=v.x-1; W.y=v.y;//上
A.x=v.x; A.y=v.y-1;//左
S.x=v.x+1; S.y=v.y;//下
D.x=v.x; D.y=v.y+1;//右
q.pop();
if(W.x>=0&&W.x<n&&W.y>=0&&W.y<m&&a[W.x][W.y]==0&&visited[W.x][W.y]==0)
{
visited[W.x][W.y]=2;
q.push(W);
father[W.x][W.y]={v.x,v.y};
if(W.x==n-1&&W.y==m-1) break;
}
if(A.x>=0&&A.x<n&&A.y>=0&&A.y<m&&a[A.x][A.y]==0&&visited[A.x][A.y]==0)
{
visited[A.x][A.y]=2;
q.push(A);
father[A.x][A.y]={v.x,v.y};
if(A.x==n-1&&A.y==m-1) break;
}
if(S.x>=0&&S.x<n&&S.y>=0&&S.y<m&&a[S.x][S.y]==0&&visited[S.x][S.y]==0)
{
visited[S.x][S.y]=2;
q.push(S);
father[S.x][S.y]={v.x,v.y};
if(S.x==n-1&&S.y==m-1) break;
}
if(D.x>=0&&D.x<n&&D.y>=0&&D.y<m&&a[D.x][D.y]==0&&visited[D.x][D.y]==0)
{
visited[D.x][D.y]=2;
q.push(D);
father[D.x][D.y]={v.x,v.y};
if(D.x==n-1&&D.y==m-1) break;
}
}
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<m;j++)
// {
// cout<<"f:"<<father[i][j].x<<","<<father[i][j].y<<" ";
// }
// cout<<endl;
// }
}
void dfs(pos p)
{
pos q;
if(p.x==0&&p.y==0) return;
q=father[p.x][p.y];
dfs(q);
cout<<"("<<p.x<<","<<p.y<<")"<<endl;
}
int main()
{
int a[10][10];
int n,m;
cin>>n>>m;
pos p={0,0};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
// cout<<"bfs:"<<endl;
BFS(a,n,m,p);
pos t={n-1,m-1};
cout<<"(0,0)"<<endl;
dfs(t);
}

查看3道真题和解析