一个矩阵存储的迷宫地图,可行走的点是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>。
程序的思想就是回溯,当走不通时就往上一步回溯,直至找到可以走的点,继续走。
- 一个矩阵存储的迷宫地图,可行走的点是0,不可走的点是1,程序输出一条可以行走的路径
- 一个走迷宫的程序
- 改进的走迷宫,可算出所有可行的路径
- 大学常见算法的java实现及思考-小老鼠走迷宫(找出一条可行路径即可)
- 自动走迷宫_记录走的路径
- 走迷宫的问题
- 走迷宫的题目
- 职场你争我抢,学点东西是没人能抢得走的。
- 百度手机地图可以走的更远
- 路是自己走的,走自己的路
- 迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法)
- 我的游戏:走迷宫
- 走迷宫-栈的使用
- 赵老师的走迷宫
- BFS的应用-走迷宫
- 吐步骤的走迷宫
- 非走不可的弯路
- VRTK 可行走区域块的实现
- ini读写举例
- mysql 视图的作用
- 翻译《The rsync algorithm》
- 测试用例设计白皮书--边界值分析方法
- 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
- 一个矩阵存储的迷宫地图,可行走的点是0,不可走的点是1,程序输出一条可以行走的路径
- fork两次如何避免僵尸进程收藏
- Android中利用OnTouchListener在ImageView中框选显示图片
- An introduction to Z-Wave programming in C#
- 杭电 hdu 1150 Machine Schedule (二分图最小覆盖)
- AIX cics程序编译 ERZ057001E的问题
- 遇到的StageFright问题 一 音视频因ALSA不同步
- C++ 成长之路
- tomcat java.net.SocketException: Too many open files