(递归+非递归)迷宫求解

来源:互联网 发布:mac qq怎么截图 编辑:程序博客网 时间:2024/06/16 04:47

代码如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<queue>#include<stack>#include<iostream>#include<algorithm>using namespace std;int map[50][50],visited[50][50],rout[50][50];int dir[][2]={0,1,1,0,0,-1,-1,0};//方向二维数组:0右,1下,2左,3上 int m,n;//----------------------递归求解---------------------void init();int judge(int x,int y);void dfs(int x0,int y0);//------------------------非递归--------------------- struct add{int x;int y;int d;};void find(){stack<add> s;add a1;a1.x=a1.y=1; s.push(a1);while(!s.empty()){add tep,e;tep=s.top(); s.pop();if(tep.x==m && tep.y==n){printf("倒序输出从(1,1)到(m,n)的路径\n");printf("x=%d y=%d\n",m,n);while(!s.empty()){e=s.top();s.pop();printf("x=%d y=%d d=%d\n",e.x,e.y,e.d);}return ;}if(judge(tep.x+dir[0][0],tep.y+dir[0][1])){e.x=tep.x;e.y=tep.y;e.d=0;s.push(e);e.x=tep.x+dir[0][0];e.y=tep.y+dir[0][1];visited[e.x][e.y]=1;s.push(e);}else if(judge(tep.x+dir[1][0],tep.y+dir[1][1])){e.x=tep.x;e.y=tep.y;e.d=1;s.push(e);e.x=tep.x+dir[1][0];e.y=tep.y+dir[1][1];visited[e.x][e.y]=1;s.push(e);}else if(judge(tep.x+dir[2][0],tep.y+dir[2][1])){e.x=tep.x;e.y=tep.y;e.d=2;s.push(e);e.x=tep.x+dir[2][0];e.y=tep.y+dir[2][1];visited[e.x][e.y]=1;s.push(e);}else if(judge(tep.x+dir[3][0],tep.y+dir[3][1])){e.x=tep.x;e.y=tep.y;e.d=3;s.push(e);e.x=tep.x+dir[3][0];e.y=tep.y+dir[3][1];visited[e.x][e.y]=1;s.push(e);}else{s.pop();}}}int main(){//m表示行数,n表示列数 init();printf("请输入m,n的大小\n");cin>>m>>n;printf("请输入迷宫\n");for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cin>>map[i][j];}}rout[1][1]=visited[1][1]=1;find();//dfs(1,1);return 0;}//-----------------递归------------------- void init() {for(int i=0;i<50;i++){for(int j=0;j<n;j++){visited[i][j]==0;rout[i][j]==0;}}memset(map,0,sizeof(map));memset(visited,0,sizeof(visited));memset(rout,0,sizeof(rout));}int judge(int x,int y){if(visited[x][y]==0 && map[x][y]==0 && x>0 && x<=m && y>0 && y<=n)return 1;return 0;}void dfs(int x0,int y0){if(x0==m && y0==n){printf("路径如下:\n");for(int i=1;i<=m;i++){for(int j=1;j<=n;j++)printf("%d ",rout[i][j]);printf("\n");}return ;}else{for(int i=0;i<4;i++){if(judge(x0+dir[i][0],y0+dir[i][1])){rout[x0+dir[i][0]][y0+dir[i][1]]=1;visited[x0+dir[i][0]][y0+dir[i][1]]=1;dfs(x0+dir[i][0],y0+dir[i][1]);rout[x0+dir[i][0]][y0+dir[i][1]]=0;visited[x0+dir[i][0]][y0+dir[i][1]]=0;}}}}


0 0
原创粉丝点击