三、搜索和二分 [Cloned] S - 搜索

原题:

定义一个二维数组: 

int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

题意:

中文题题意很明显。

题解:

迷宫问题依然是广搜,不断从一个点进行四个方向的搜索并且入队列,因为要输出步骤,所以讲数据保存在一个队列中,最后广搜结束后直接从队尾开始输出就行了。

代码:AC

#include<iostream>
#include<cstring>
using namespace std;
int a[5][5];
int dis[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct Node{
	int x,y,pre;
}queue[100];
int front=0;
int rear=0;
int visit[5][5];
void bfs(int beginX,int beginY,int endX,int endY)
{
	queue[0].x=beginX,queue[0].y=beginY,queue[0].pre=-1;
	rear=rear+1;
	visit[beginX][beginY]=1;
	while(front<rear)
	{
		for(int i=0;i<4;i++)
		{
			int newx=queue[front].x+dis[i][0];
			int newy=queue[front].y+dis[i][1];
			if(newx<0||newx>5||newy<0||newy>5||a[newx][newy]==1||visit[newx][newy]==1)
				continue;
			queue[rear].x=newx;
			queue[rear].y=newy;
			queue[rear].pre=front;
			rear++;
			visit[newx][newy]=1;
			if(newx==endX&&newy==endY){
				return;
			}
		}
		front++;
	}
}
 
void print(Node now)
{
	if(now.pre==-1)
		cout<<"("<<now.x<<", "<<now.y<<")"<<endl;
	else
	{
		print(queue[now.pre]);
		cout<<"("<<now.x<<", "<<now.y<<")"<<endl;
	}
}
 
int main()
{  
   for(int i=0;i<5;i++)
   {
	   for(int j=0;j<5;j++)
	   {
		    cin>>a[i][j];
	   }	  
   }
   bfs(0,0,4,4);
   print(queue[rear-1]);
   return 0;
}

猜你喜欢

转载自blog.csdn.net/npuyan/article/details/81416844
今日推荐