主题:求迷宫程序
网络虫虫
[专家分:10] 发布于 2006-03-27 19:36:00
小弟是刚接触数据结构的菜鸟。希望大家照顾下!求迷宫程序,帮帮忙![em8]
回复列表 (共7个回复)
沙发
Sandyboy520 [专家分:80] 发布于 2006-03-28 20:25:00
用栈来写呀。严老太的书上不是有吗?
板凳
justforfun626 [专家分:18460] 发布于 2006-03-30 13:15:00
He just wants the code, and does not want to learn...
3 楼
narsh [专家分:790] 发布于 2006-03-30 17:11:00
用VC6.0做的,我当时可是呕心沥血啊,望你珍视
#include"iostream.h"
#define MAXSIZE 1024
#define m 6
#define n 8
typedef struct node1{int x,y;}item;
typedef struct node2{int x,y,d;}sanwei;
typedef struct node3{sanwei data[MAXSIZE];int top;}Seqstack;//定义栈类型
////初始化栈
Seqstack *Init_Seqstack()
{
Seqstack *s;
s=new Seqstack;
if(!s)
{
cout<<" 空间不足"<<endl;
return NULL;
}
else{
s->top=-1;
return s;}
}
//判断栈空
int Empty_Seqstack(Seqstack *s)
{
if(s->top==-1)
return 1;
else
return 0;
}
//入栈
int Push_Seqstack(Seqstack *s,sanwei x)
{
if(s->top==MAXSIZE-1)
return 0;
else
{
s->top++;
s->data[s->top].x=x.x;
s->data[s->top].y=x.y;
s->data[s->top].d=x.d;
return 1;
}
}
//出栈
int Pop_Seqstack(Seqstack *s,sanwei *x)
{
if(Empty_Seqstack(s))
return 0;
else
{
*x=s->data[s->top];
s->top--;
return 1;
}
}
//迷宫
int path(int maze[m+2][n+2],item move[8])
{
Seqstack s;
s=*Init_Seqstack();
sanwei temp;
int x,y,d,i,j;
temp.x=1;
temp.y=1;
temp.d=-1;
Push_Seqstack(&s,temp);
while(!Empty_Seqstack(&s))
{
Pop_Seqstack(&s,&temp);
x=temp.x;
y=temp.y;
d=temp.d+1;
while(d<8)
{
i=x+move[d].x;
j=y+move[d].y;
if(maze[i][j]==0)
{
temp.x=x;
temp.y=y;
temp.d=d;
Push_Seqstack(&s,temp);//坐标及方向入栈
x=i;
y=j;
maze[x][y]=-1;//到达新点
if(x==m&&y==n)
{
cout<<"There is a way:";
int x,y,d;
for(;s.top!=-1;s.top--)
{x=s.data[s.top].x;y=s.data[s.top].y;d=s.data[s.top].d;cout<<x<<y<<d<<" ";}//输出路径
return 1;
}//迷宫有路
else
d=0;
}
else
d++;
}//while(d<8)
}//while
return 0;//迷宫无路
}
int main()
{
item move[8];
int maze[m+2][n+2];
move[0].x=0; move[0].y=1;
move[1].x=1; move[1].y=1;
move[2].x=1; move[2].y=0;
move[3].x=1; move[3].y=-1;
move[4].x=0; move[4].y=-1;
move[5].x=-1;move[5].y=-1;
move[6].x=-1;move[6].y=1;
move[7].x=-1;move[7].y=1;//初始化move[8]
int i,j;
for(i=0;i<=m+1;i++)
for(j=0;j<=n+1;j++)
maze[i][j]=1;//初始化迷宫矩阵
cout<<"Please input i j(end with 0 0):";
cin>>i>>j;
while((i+j)!=0)
{
maze[i][j]=0;
cin>>i>>j;
} //用户自定义迷宫
for(i=0;i<=m+1;i++)
{
for(j=0;j<=n+1;j++)
cout<<maze[i][j]<<" "; //输出迷宫矩阵
cout<<endl;
}
int q;
q=path(maze,move);
if(!q)
cout<<"There is not a such way"<<endl;
return 1;
}
4 楼
雨下的时候 [专家分:440] 发布于 2006-04-01 03:54:00
楼上的,写这个花了多少时间?
5 楼
narsh [专家分:790] 发布于 2006-04-01 08:28:00
我这个人比较笨,大约写了一周吧
6 楼
Tokyson [专家分:90] 发布于 2006-04-01 18:32:00
3楼强人,水平和我差不多,呵呵
7 楼
冷月星光 [专家分:16520] 发布于 2006-04-03 12:56:00
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#define m 4
#define n 4
struct stype//设置一个迷宫节点的数据结构
{int x,y;//每个迷宫格子的坐标
}stack[400];
int mg[m+1][n+1];//设置整个寻找区间(四周外加一层障碍以便对边缘节点索)
int zx[8],zy[8];//设置八个寻找方向
void printlj(int TOP)//输出最短路径
{int i;
for(i=1;i<=TOP;i++)
{printf("(%d,%d)",stack[i].x,stack[i].y);
}
}
void mglj()
{int i,j,x,y,top,find,v,flag;
top=1;
flag=0;
stack[1].x=1;stack[1].y=1;
find=0;
mg[1][1]=-1;
while(top>=1&&!find))//深度优先的搜索技术
{x=stack[top].x;
y=stack[top].y;
for(v=1;v<=8;v++)//扫描八个可以走的方向
{i=x+zx[v];
j=y+zy[v];
if(mg[i][j]==0)//找到一个可以走的方向进入栈
{top++;
stack[top].x=i;
stack[top].y=j;
mg[i][j]=-1;//避免重复选择
flag=1; //标志在当前点可以找到一个可以走的方向
break; //不再对当前节点扫描
}
if(v==8)//八个方向已经被全部扫描过,无可以通的路
{flag=0;//标志当前节点没有往前的路
top--; //后退一个节点搜索
}
}
if((stack[top].x ==m)&&(stack[top].y ==n))//找到了目的地
{printlj(top);//输出
find=1; //退出循环
}
}
if(!find) printf("不存在路径\n");
}
void main()
{int i,j;
for(i=1;i<=m;i++) //输入迷宫图形 0表示可以通 1表示不可以通
for(j=1;j<=n;j++)
scanf("%d",&mg[i][j]);
for(i=0;i<=m+1;i++) //设置四周障碍
{mg[i][0]=1;mg[i][n+1]=1;
}
for(j=0;i<=n+1;i++)
{mg[0][j]=1;mg[m+1][j]=1;
}
zx[1]=-1;zx[2]=-1;zx[3]=0;zx[4]=1; //设置方向
zx[5]=1;zx[6]=1;zx[7]=0;zx[8]=-1;
zy[1]=0;zy[2]=1;zy[3]=1;zy[4]=1;
zy[5]=0;zy[6]=-1;zy[7]=-1;zy[8]=-1;
mglj();
}
我来回复