1. 程式人生 > >迷宮問題BFS

迷宮問題BFS

相信大家在學習資料結構時都會遇到一個問題,即迷宮問題。一般來說大家都會像真實走迷宮一樣進行DFS搜尋,但我今天給出的是隨機生成迷宮且找最短路徑的程式碼。通過這一次的程式設計,我發現自己要注意以下兩點:1.要注意程式執行過程中的變數改變;2.對於複雜的條件判斷,需要細心。

Have fun coding,i_human.Have fun coding,everyone!

THE CODE:

// 資料結構迷宮.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <cstdlib>
#include<iostream>
#include<queue>
#include<ctime>
#define N 4  //定義迷宮為4*4

using namespace std;

struct pot  //為記錄路徑的rec[]準備,座標(x,y)
{
	int x;
	int y;
	inline bool operator ==(const pot a)
	{
	return x==a.x && y==a.y;
	}
};

class maze
{
public:
	maze();
	bool find();
	void print();
	void path();
	~maze(){};
private:
	void create();
	void clearrec();
	int pic[N+2][N+2];  //迷宮本身
	pot rec[N+1][N+1];  //BFS過程中記錄路徑
};

maze::maze()
{
	create();
	clearrec();
}

bool maze::find()  //使用BFS尋求最短路徑
{
	pot n;n.x=n.y=0;
	queue<pot>qu;
	pot tmp;tmp.x=tmp.y=1;
	qu.push(tmp);
	while(!qu.empty())
	{
		if(pic[qu.front().x][qu.front().y-1]!=1 && rec[qu.front().x][qu.front().y-1]==n)
		{
			tmp.x=qu.front().x;tmp.y=qu.front().y-1;
			qu.push(tmp);
			tmp.y++;
			rec[qu.front().x][qu.front().y-1]=tmp;
			if(pic[qu.front().x][qu.front().y-1]==3)
				return true;
		}
		if(pic[qu.front().x+1][qu.front().y]!=1 && rec[qu.front().x+1][qu.front().y]==n)
		{
			tmp.x=qu.front().x+1;tmp.y=qu.front().y;
			qu.push(tmp);
			tmp.x--;
			rec[qu.front().x+1][qu.front().y]=tmp;
			if(pic[qu.front().x+1][qu.front().y]==3)
				return true;
		}
		if(pic[qu.front().x][qu.front().y+1]!=1 && rec[qu.front().x][qu.front().y+1]==n)
		{
			tmp.x=qu.front().x;tmp.y=qu.front().y+1;
			qu.push(tmp);
			tmp.y--;
			rec[qu.front().x][qu.front().y+1]=tmp;
			if(pic[qu.front().x][qu.front().y+1]==3)
				return true;
		}
		if(pic[qu.front().x-1][qu.front().y]!=1 && rec[qu.front().x-1][qu.front().y]==n)
		{
			tmp.x=qu.front().x-1;tmp.y=qu.front().y;
			qu.push(tmp);
			tmp.x++;
			rec[qu.front().x-1][qu.front().y]=tmp;
			if(pic[qu.front().x-1][qu.front().y]==3)
				return true;
		}
		qu.pop();
	}
	return false;
}

void maze::path()
{
	int a=N,b=N;
	while(pic[a][b]!=2)
	{
		cout<<"("<<a<<","<<b<<")"<<"<--";
		int c=a;
		a=rec[a][b].x;
		b=rec[c][b].y;
	}
	cout<<"(1,1)"<<endl;
}

void maze::print()  //打印出隨機生成的迷宮
{
	for(int i=0;i<N+2;i++)
	{
		for(int j=0;j<N+2;j++)
			cout<<pic[i][j]<<" ";
		cout<<endl;
	}
}

void maze::create()  //隨機生成迷宮,每次以左上為起點,右下為終點
{
	for(int i=0;i<N+2;i++)
		pic[0][i]=pic[N+1][i]=1;
	for(int i=1;i<N+1;i++)
		pic[i][0]=pic[i][N+1]=1;
	srand((unsigned)time(NULL));
	for(int i=1;i<N+1;i++)
		for(int j=1;j<N+1;j++)
			pic[i][j]=rand()%2;
	pic[1][1]=2;
	pic[N][N]=3;
}

void maze::clearrec() //初始化路徑記錄器
{
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			rec[i][j].x=rec[i][j].y=0;
	rec[1][1].x=rec[1][1].y=N;  //防止回到起點的無用操作
}

int main()
{
	maze example;
	example.print(); 
	if(example.find())
		example.path();
	else
		cout<<"the solution can not be found."<<endl;
	system("pause");
	return 0;
}