刚开始接触算法,写了一个迷宫题,用的是DFS。思路很简单,代码注释了,但是不知道哪里错了。记录在博客里。
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
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
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
我的代码。。。。。
#include<iostream> #include<stack> using namespace std; class Point{ public: int x,y; public : Point(int i ,int j) { x=i; y=j; } }; void search(int i,int j,int map[30][30]{ stack<Point> s; if(map[i][j+1]=0){ s.push(Point(i,j+1)); //从当前点向上找,如果能走,就将当前点标记为1,并压入栈。 map[i][j+1]=1; j=j+1; search(i,j,map); //将找到的点作为当前点,继续搜索。 } else{ if(map[i][j-1]=0){ s.push(Point(i,j-1)); map[i][j-1]=1; //向下找 j=j-1; search(i,j,map); } else{ if(map[i-1][j]=0){ s.push(Point(i-1,j)); map[i-1][j]=1; //向左找 i=i-1; search(i,j,map); } else{ if(map[i+1][j]=0){ s.push(Point(i+1,j)); //向右找 map[i+1][j]=1; i=i+1; search(i,j,map); } else{ Point t = s.top(); map[t.x][t.y]=1; //当前点找不到可以延伸的点,将当前点值标记1,弹出栈, s.pop(); search(s.top().x, s.top().y, map); //搜索栈顶元素可以延伸的元素 } } } } } int map[30][30]; //全局变量 int i,j; int main(){ const int n=5; int cow,col; stack<Point> s; Point start(1,1); Point end(n,n); i=n; j=n; for(cow=1;cow<=n;cow++){ for(col=1;col<=n;col++){ //输入一个迷宫图 cin>>map[cow][col]; } } for(col=1;col<=n;col++){ map[0][col]=1; map[n+1][col]=1; //在迷宫图周围加一圈1,表示不可访问 } for(cow=0;cow<n+2;cow++){ map[cow][0]=1; map[cow][n+1]=1; } s.push(end); //将终点压入栈 while( i!=1&&j!=1 ){ //当未找到起点时 search(i,j,map); } while(s.empty() !=true){ cout<<"("<<(s.top().x)-1<<","<<(s.top().y)-1<<")"<<endl; //输出结果 s.pop(); } }