题解 | #迷宫问题#参考了别人的

迷宫问题

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);
}


全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务