一个矩阵存储的迷宫地图,可行走的点是0,不可走的点是1,程序输出一条可以行走的路径

来源:互联网 发布:数据统计 英文 编辑:程序博客网 时间:2024/06/12 06:49

写matrix.txt放到E盘下,程序输出可以行走的结果

程序输出结果
#include<deque>#include<fstream>#include<iostream>#include<stdlib.h>using namespace std;struct Point{int x;int y;Point& down(){x+=1;return *this;}Point& up(){x-=1;return *this;}Point& left(){y-=1;return *this;}Point right(){y+=1;return *this;}};enum e{RIGHT,DOWN,LEFT,UP};template<int N,int M>struct Map{int matrix[N][M];deque<Point> path;void init(istream& i){for(int x=0;x<N;x++){for(int y=0;y<M;y++){i>>matrix[x][y];}}}bool test(int x,int y){        if(x<0 || x>N-1 || y<0 || y>M-1)return 0;if(matrix[x][y]>=1)return 0;return 1;}bool test(Point p){        return test(p.x,p.y);}bool is_terminal(int x,int y){        if(x==N-1 && y==M-1)return 1;return 0;}bool is_terminal(Point p){        return is_terminal(p.x,p.y);}void set_1(Point p){matrix[p.x][p.y]=1;}void print(){deque<Point>::iterator it=path.begin();while(it!=path.end()){cout<<"("<<(*it).x<<","<<(*it).y<<")"<<"  ";it++;}}void print_(){for(int x=0;x<N;x++){for(int y=0;y<M;y++){cout<<matrix[x][y]<<" ";}cout<<endl;}}void print_path(){char matri[N][M];for(int i=0;i<N;i++){for(int j=0;j<M;j++){matri[i][j]='#';}}deque<Point>::iterator it=path.begin();for(;it!=path.end();it++){matri[(*it).x][(*it).y]=' ';}for(i=0;i<N;i++){for(int j=0;j<M;j++){cout<<matri[i][j]<<" ";}cout<<endl;}}bool is_start(Point p){return (p.x==0 && p.y==0);}bool isBlocked(Point p){if(!test(p.x,p.y+1) && !test(p.x,p.y-1) && !test(p.x+1,p.y) && !test(p.x-1,p.y)){return 1;}return 0;}int search_dir(Point p){if(test(p.x+1,p.y))return DOWN;if(test(p.x,p.y+1))return RIGHT;if(test(p.x-1,p.y))return UP;if(test(p.x,p.y-1))return LEFT;return -1;}void move(Point& currentPoint){set_1(currentPoint);path.push_back(currentPoint);if(is_terminal(currentPoint)){print();cout<<endl;return;}while(isBlocked(currentPoint)){path.pop_back();if(path.empty()){cout<<"no path\n";return;}else{currentPoint=path.back();}}if(search_dir(currentPoint)==DOWN){currentPoint.down();move(currentPoint);}else{if(search_dir(currentPoint)==RIGHT){currentPoint.right();move(currentPoint);}else{if(search_dir(currentPoint)==UP){currentPoint.up();move(currentPoint);}else{currentPoint.left();move(currentPoint);}}}}void start(){fstream f;f.open("E:\\matrix.txt");init(f);print_();Point p;p.x=0;p.y=0;move(p);print_path();f.close();}};void main(){Map<9,8> m;m.start();}

其中Map<9,8>制定地图大小为9*8的大小。

当输入其他规模时,就修改该值,比如3*3的地图,就写Map<3,3>。

程序的思想就是回溯,当走不通时就往上一步回溯,直至找到可以走的点,继续走。