c++ 使用广度优先算法走迷宫,并记录搜索出来的路径。最终标记出来
#########################################################
#include <iostream>
#include <vector>//const int 12=12;
//const int 12=12;using std::cout;
using std::endl; using std::vector; struct node { int x; int y; int s; int px; int py; };typedef struct node Node;
vector<Node> route(12*12);vector<vector<int> > vec;
vector<vector<int> > book(12,vector<int>(12,0)); int dx=10, dy=11,min=9999999; int next[4][2]={ {-1,0},{0,-1},{1,0},{0,1}}; int head, tail;void show(vector<vector<int> > avec)
{ vector<vector<int> >::const_iterator cit; vector<int>::const_iterator it; for(cit=avec.begin(); cit!=avec.end();++cit) { vector<int> pvec = *cit; for(it=pvec.begin();it!=pvec.end();++it) cout << *it << " "; cout << endl; } } vector<vector<int> > block(int x1, int y1, int x2, int y2, vector<vector<int> > avec) { for(int i=x1;i<=x2;++i) { for(int j=y1;j<=y2;++j) avec[i][j]=1; } return avec; } vector<vector<int> > init() { vector<vector<int> > avec(12, vector<int>(12,0)); for(int i=0;i<12;++i) { avec[i][0]=1; avec[i][12-1]=1; } for(int j=0;j<12;++j) { avec[0][j]=1; avec[12-1][j]=1; }avec[1][0]=0; //in
avec[10][11]=0; // out avec[2][1]=1; avec[2][2]=1; avec[3][2]=1; avec[4][2]=1; avec[6][2]=1; avec[6][1]=1; avec[1][7]=1; avec=block(2,4,3,7,avec); avec=block(5,5,6,9,avec); avec=block(8,1,8,4,avec); avec=block(8,6,9,7,avec); avec=block(8,9,9,10,avec); avec=block(2,9,4,9,avec); avec[5][10]=1; avec[10][7]=1; return avec; }//void bfs(int sx, int sy, int dx, int dy)
vector<node> bfs(int sx, int sy, int dx, int dy) { vector<Node> route(12*12);route[tail].x=sx;
route[tail].y=sy; route[tail].s=0; tail++;while(head < tail)
{ for(int i=0;i<4;++i) { int nx=route[head].x+next[i][0]; int ny=route[head].y+next[i][1];if(nx<0 || nx > 12-1 || ny < 0 || ny > 12-1)
continue; if(vec[nx][ny]==0 && book[nx][ny]==0) { book[nx][ny]=1; route[tail].x=nx; route[tail].y=ny; route[tail].s=route[head].s+1; route[tail].px=route[head].x; route[tail].py=route[head].y; tail++; }if(nx==dx && ny==dy)
{ if (route[tail-1].s < min) min=route[tail-1].s; cout << min << endl; return route; } } head++; }vector<Node> x;
return x; }void lable(vector<Node> vn, vector<vector<int> > &avec)
{ int temp=min; int nx=dx; int ny=dy; for(int i=tail-1;i>0;--i) { int x=vn[i].x; int y=vn[i].y; int px=vn[i].px; int py=vn[i].py; int s=vn[i].s; if(s==temp && x==nx && y==ny) { avec[px][py]=9; cout << s << "\t" << temp << endl; nx=px; ny=py; --temp; } } }int main(void)
{ vec=init(); int sx=1; int sy=0; vec[sx][sy]=9;show(vec);
route=bfs(sx,sy,dx,dy); //cout << head << "\t" << tail << " " << min << endl; //for(int i=0;i<=tail;++i) //{ // cout << i << " " << route[i].x << " " << route[i].y << " " << route[i].s << " " << route[i].px << " " << route[i].py << endl; //} lable(route, vec); show(vec); } #################################运行的结果:
1 1 1 1 1 1 1 1 1 1 1 1
9 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 20 1 1 1 1 1 1 1 1 1 1 1 1 9 9 9 9 0 0 0 1 0 0 0 1 1 1 1 9 1 1 1 1 0 1 0 1 1 0 1 9 1 1 1 1 0 1 0 1 1 0 1 9 0 0 0 0 0 1 0 1 1 0 0 9 0 1 1 1 1 1 1 1 1 1 1 9 0 1 1 1 1 1 0 1 1 0 0 9 9 9 9 9 9 0 0 1 1 1 1 1 1 0 1 1 9 1 1 1 1 0 0 0 0 0 1 1 9 1 1 1 1 0 0 0 0 0 0 1 9 9 9 0 1 1 1 1 1 1 1 1 1 1 1 1