#include<iostream>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 10000
bool val[100][100];
int mp[100][100],ne[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int x,y,m,n;
enum Status{
OK=1,
ERROR=0,
OVERFLOW=-1
};
typedef struct {
int x,y;
}map;
map mm[200][200];
void init(){
for(int i=0;i<200;i++)
for(int j=0;j<200;j++){
mm[i][j].x=0;
mm[i][j].y=0;
}
for(int i=0;i<100;i++)
for(int j=0;j<100;j++){
mp[i][j]=0;
val[i][j]=0;
}
}
struct SqStack{
map *top;
map *base;
int StackSize;
Status Init(SqStack &S){
S.base=new map[MAXSIZE];
S.top=S.base;
S.StackSize=MAXSIZE;
return OK;
}
Status push(SqStack &S,map e){
// cout<<e.x<<' '<<e.y<<endl;
if(S.StackSize==0)
return OVERFLOW;
S.top->x=e.x;
S.top->y=e.y;
S.top++;
--S.StackSize;
return OK;
}
Status pop(SqStack &S,map &e){
if(S.StackSize==100)
return ERROR;
--S.top;
e.x=S.top->x;
e.y=S.top->y;
++S.StackSize;
// cout<<"e="<<e.x<<' '<<e.y<<endl;
return OK;
}
bool empty(SqStack S){
// cout<<"size="<<S.StackSize<<endl;
if(S.StackSize==MAXSIZE)
return true;
return false;
}
};
bool solve(int p,int q){
map m;
val[1][1]=true;
m.x=1,m.y=1;
SqStack s;
s.Init(s);
s.push(s,m);
// cout<<"s"<<' '<<s.top->x<<' '<<s.top->y<<endl;
while(!s.empty(s)){
// cout<<"s.empty"<<s.empty(s)<<endl;
map now;
s.pop(s,now);
// cout<<"s,empty"<<s.empty(s)<<endl;
// cout<<"now.x="<<now.x<<" now.y="<<now.y<<endl;
if(now.x==p&&now.y==q){
return true;
}
for(int i=0;i<4;i++){
int nx=now.x+ne[i][0];
int ny=now.y+ne[i][1];
// cout<<"nx="<<nx<<' '<<"ny="<<ny<<endl;
if(!val[nx][ny]&&nx>=1&&nx<=x&&ny>=1&&ny<=y&&!mp[nx][ny]){
map nex;
nex.x=nx;
nex.y=ny;
// cout<<"nx="<<nx<<' '<<"ny="<<ny<<endl;
s.push(s,nex);
val[nx][ny]=true;
mm[nx][ny].x=now.x;
mm[nx][ny].y=now.y;
}
}
}
return false;
}
void move(int x,int y)
{
if(x==1&&y==1)
return ;
move(mm[x][y].x,mm[x][y].y);
// printf("%d %d\n",mm[x][y].x,mm[x][y].y);
mp[mm[x][y].x][mm[x][y].y]=8;
}
int main()
{
printf("默认入口为(1,1)请输入迷宫大小和终点坐标(1-50):\n");
cin>>x>>y>>m>>n;
// printf("输入0或1,0代表可通过1代表不可通过\n");
// printf("输入1自己设计迷宫,输入2系统自动生成迷宫")
int qq=20,ff=0;
printf("输入1自己设计迷宫,输入2选择系统自动生成迷宫:\n");
int kk=0;
cin>>kk;
printf("\n");
printf("迷宫实例如下0表示可以通过,1表示不可以通过\n");
cout<<"0 1 1"<<endl;
cout<<"0 0 1"<<endl;
cout<<"0 0 0"<<endl;
if(kk==2)
while(!ff)
{
for(int i=1;i<=x;i++)
for(int j=1;j<=y;j++)
mp[i][j]=rand()%2;
printf("系统随机生成的迷宫为\n");
for(int i=1;i<=x;i++)
for(int j=1;j<=y;j++)
cout<<mp[i][j]<<" \n"[j==y];
if(solve(m,n)){
printf("ok!!!\n");
ff=1;
move(n,m);
mp[n][m]=8;
for(int i=1;i<=x;i++)
for(int j=1;j<=y;j++)
cout<<mp[i][j]<<" \n"[j==y];
}
else printf("fail!!!");
init();
printf("\n");
}
else {
printf("请输入迷宫:\n");
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>mp[i][j];
if(solve(m,n)){
printf("ok!!!\n");
printf("迷宫路径如下,用8表示:\n");
move(n,m);
mp[n][m]=8;
for(int i=1;i<=x;i++)
for(int j=1;j<=y;j++)
cout<<mp[i][j]<<" \n"[j==y];
}
else printf("fail!!!");
}
return 0;
}
c语言栈实现迷宫
最新推荐文章于 2022-12-23 10:28:02 发布