注明:原文见博客http://blog.csdn.net/raphealguo/article/details/7523411,写的非常详细、细致。
我主要针对它的算法实现了C++版本的广度优先搜索。
迷宫问题:
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
代码:
#include<math.h>
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<queue>
#define MAXL 5
using namespace std;
bool isValid(vector<vector<int> >& maze, int x, int y){
return !maze[x][y];
}
bool maze_search(vector<vector<int> >& maze, vector<int>& vs, vector<int>& vd){
queue<vector<int> > qvec;
bool visit[MAXL][MAXL];
for (int i = 0; i < MAXL; i++) {
for (int j = 0; j < MAXL; j++) {
visit[i][j] = false;
}
}
int dir[][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
qvec.push(vs);
visit[vs[0]][vs[1]] = true;
while(!qvec.empty()){
vector<int> vn;
vn = qvec.front();
qvec.pop();
for(int i=0; i<4; i++){
int vx = vn[0] + dir[i][0];
int vy = vn[1] + dir[i][1];
if(vx==vd[0] && vy==vd[1])
return true;
if((vx>=0 && vx<MAXL && vy>=0 && vy<MAXL) && isValid(maze, vx, vy) && !visit[vx][vy]){
vector<int> tmp;
tmp.push_back(vx);
tmp.push_back(vy);
qvec.push(tmp);
visit[vx][vy] = true;
}
}
}
return false;
}
void display_2_vector(vector<vector<int> > ivec){
for(int i=0; i<ivec.size(); i++){
for(int j=0; j<ivec[0].size(); j++){
cout<< ivec[i][j]<< " ";
}
cout<<endl;
}
}
int main(void)
{
int a[MAXL][MAXL] = {{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}};
vector<vector<int> > maze(MAXL, vector<int>(MAXL));
for(int i=0; i<MAXL; i++){
for(int j=0; j<MAXL; j++){
maze[i][j] = a[i][j];
}
}
vector<int> vs(2, 0);
vector<int> vd(2, 4);
cout<<maze_search(maze, vs, vd)<<endl;
display_2_vector(maze);
}