BFS-广度优先遍历

#include <iostream>
#include <queue>

using namespace std;

/*
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
0 0 4 1

6
--------------------------------
Process exited with return value 0
Press any key to continue . . .
*/

//一个坐标节点
class Node
{
public:
	Node(int _x, int _y, int _flag, int _step)
	{
		this->x = _x;
		this->y = _y;
		this->flag = _flag;
		this->step = _step; 
	}
public:
	int x;
	int y;
	int flag;
	int step;
};

int n, m;// 迷宫行、列 
int beginx, beginy, endx, endy;// 入口坐标,出口坐标 
int maze[20][20] = {0}, book[20][20] = {0};// 存放迷宫、标记是否访问过 
int direction[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };// 方向数组 
queue<Node> qmaze;// 队列 

void BFS()
{
	//创建一个坐标节点 
	Node firtnode(beginx, beginy, 0, 0);
	
	//压入队列,并设置为已经访问 
	qmaze.push(firtnode);
	book[beginx][beginy] = 1;
	
	//队列不为空时 
	while(!qmaze.empty())
	{
		//是否找到出口 
		int flag = 0;
		
		//枚举四个方向 
		for(int i = 0; i <= 3; i++)
		{
			//获取下一个节点的坐标 
			int tx = qmaze.front().x + direction[i][0];
			int ty = qmaze.front().y + direction[i][1];
			
			//是否越界 
			if(tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1)
			{
				continue;
			}
				
			//是否已经访问过,是否是路 
			if(maze[tx][ty] == 0 && book[tx][ty] == 0)
			{ 
				book[tx][ty] = 1;
				
				Node & tempnode = qmaze.front();
				Node node(tx, ty, tempnode.flag, tempnode.step += 1);
				
				qmaze.push(node);
			}
			
			//如果找到,则跳出 
			if(tx == endx && ty == endy)
			{
				flag = 1;
				break;
			}
		}
		
		//如果找到,则跳出 
		if(flag)
		{
			break;
		}
		 
		qmaze.pop();
	}
}

int main()
{
	cin >> n >> m;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			cin >> maze[i][j];
	cin >> beginx >> beginy >> endx >> endy;
	
	BFS();
	
	Node & result = qmaze.front();
	cout << endl << result.step; 
	
	return 0;
} 

  

posted @ 2017-02-07 01:25  GordonDicaprio  阅读(234)  评论(0编辑  收藏  举报