迷宫问题求解
任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX 500 //栈的最大值
struct Point
{
int x,y;
int vector[4],sum;///0 1 2 3 表示上下左右
char c;
int visit[4];
Point operator=(Point &a)
{
x=a.x;y=a.y;sum=a.sum;c=a.c;
for(int i=0;i<4;i++)
{
visit[i]=a.visit[i];
vector[i]=a.vector[i];
}
}
}point[500][500];
typedef struct
{ Point base[MAX];
int top;
}SqStack;
SqStack SqStackInit()//初始化栈
{
SqStack S;
S.top=-1;
return S;
}
bool StackEmpty(SqStack S)//判断栈空
{
if(S.top==-1)
return true;
else
return false;
}
void SqStackPush(SqStack &S,Point x)//入栈
{
if(S.top==MAX-1)
{
cout<<"栈满了";
return ;
}
S.top++;
S.base[S.top]=x;
}
void SqStackPop(SqStack &S)//出栈
{
if(S.top==-1)
{
cout<<"栈满了";
return ;
}
S.top--;
}
Point GetSqStackTop(SqStack S)//取栈顶元素
{
return (S.base[S.top]);
}
char answer[500][500];
SqStack S=SqStackInit();
void input(int n,int m)
{
cout<<"请输入迷宫矩阵,‘.’代表路径,‘x’代表墙壁\n";
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{cin>>point[i][j].c;point[i][j].x=i;point[i][j].y=j;}
}
void init(int n,int m)
{
int a[4]={1,-1,0,0};
int b[4]={0,0,-1,1};
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{ point[i][j].sum=0;
for(int k=0;k<4;k++)
if(point[i][j].c=='.'&&point[i+a[k]][j+b[k]].c=='.')
{point[i][j].vector[k]=1;point[i][j].sum++;point[i][j].visit[k]=0;}
else {point[i][j].vector[k]=0;point[i][j].visit[k]=1;}
}
}
void show(int n,int m)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<answer[i][j];
cout<<endl;
}
}
void show2(int n,int m)
{
for(int i=1;i<=n;i++)
{printf("%-4d",i);
for(int j=1;j<=m;j++)
{
for(int k=0;k<4;k++) cout<<point[i][j].visit[k];
}
cout<<endl;
}
}
void solve(int n,int m)
{ memset(answer,'.',sizeof(answer));
int x=1,y=1;
SqStackPush( S,point[x][y]);
/*x=S.top().x;y=S.top().y;
cout<<" x= "<<x<<" y="<<y<<endl;*/
if(StackEmpty(S))cout<<"kong";
while(!StackEmpty(S))
{
Point top=GetSqStackTop(S);
//show2(n,m);
if(point[x][y].visit[0]==0&&point[x][y].vector[0]==1)
{
point[x++][y].visit[0]=1;
point[x][y].visit[1]=1;
SqStackPush(S,point[x][y]);
}
else if(point[x][y].visit[1]==0&&point[x][y].vector[1]==1)
{
point[x--][y].visit[1]=1;
point[x][y].visit[0]=1;
SqStackPush(S,point[x][y]);
}
else if(point[x][y].visit[2]==0&&point[x][y].vector[2]==1)
{
point[x][y--].visit[2]=1;
point[x][y].visit[3]=1;
SqStackPush(S,point[x][y]);
}
else if(point[x][y].visit[3]==0&&point[x][y].vector[3]==1)
{
point[x][y++].visit[3]=1;
point[x][y].visit[2]=1;
SqStackPush(S,point[x][y]);
}
else if(point[x][y].visit[0]==1&&point[x][y].visit[1]==1&&point[x][y].visit[2]==1&&point[x][y].visit[3]==1)
{SqStackPop(S);if(StackEmpty(S))///当前点上下左右全访问过并且此点不是终点
{
cout<<"没有可行路径!\n";break;
}}
x=GetSqStackTop(S).x;y=GetSqStackTop(S).y;
// cout<<" x= "<<x<<" y="<<y<<endl;
if(point[x][y].x==n&&point[x][y].y==m)
{ cout<<"到达终点,通路如下:\n";
while(!StackEmpty(S))
{
Point ans;
ans.x=GetSqStackTop(S).x;
ans.y=GetSqStackTop(S).y;
SqStackPop(S);
x=ans.x;y=ans.y;
//cout<<x<<" "<<y<<" ";
answer[x][y]='@';
}
show(n,m);
break;
}
}
}
int main()
{
int n,m;
cout<<"输入行数和列数:\n";
while(cin>>n>>m)
{
memset(point,'x',sizeof(point));//初始化全墙壁
input(n,m);
init(n,m);
//show2(n,m);
solve(n,m);
cout<<"输入行数和列数:\n";
}
return 0;
}
测试数据:(给一组,稍作改动即是多组)
17 54
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.xxxxxx.......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
.xxxxxx.xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx........xx
........xxxx.xxxxxx..........xxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx..................xxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxx.xxxxxxxxx.xxxxxxx
xxxxxxx.............xxxxxxxxxxxxxxxx.xxxxxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxx...................xx........xxxxxxx
xxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxx......xx
xxxxxxxxxxxxxxxxxx......................xxxxxxxxxxx..x
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..