代码如下:
#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;
}
}
}
}