首页
社区
课程
招聘
[求助]一个寻路问题在汇编中如何实现
发表于: 2007-12-17 17:15 4292

[求助]一个寻路问题在汇编中如何实现

2007-12-17 17:15
4292
我汇编比较菜 先面是C码大家看看 如何在汇编中实现
迷宫坐标位置类型
typedef struct maze{
int a;
int b;
int dir;
struct maze *next;
}mazestack;
栈的基本操作实现
1) 栈的初始化
mazestack *creat(){
mazestack * p;
p=(mazestack *)malloc(sizeof(mazestack)); //开辟坐标空间
if(!p)
return NULL; //开辟失败,返回空值
p->next=NULL;
return p; //返回栈顶指针
}
2) 压栈操作
mazestack * push(mazestack * p,int i,int j,int k) //p为栈顶指针
i , j为坐标参数,k为通路下一步方向代码
{
mazestack * p1;
p1=(mazestack *)malloc(sizeof(mazestack)); //开辟坐标空间
if(!p1)
return NULL;
p1->a=i;
p1->b=j;
p1->dir=k; //将参数导入坐标空间
p1->next=p; //将新开辟空间压入栈
p=p1; //移动栈顶指针到新栈顶
return p; //返回栈顶指针
}
3) 弹栈操作
mazestack * pop(mazestack *p, int *i,int *j,int *k) // p为栈顶指针,i,j为坐标参数,k为通路下一步方向代码
{
mazestack *p1;
p1=p;
*i=p1->a;
*j=p1->b;
*k=p1->dir; //将空间中坐标和方向代码导出
p=p->next; //将栈顶指针移动到新栈顶位置
free(p1); //释放旧栈顶空间
return p;
}
4) 判断栈空
int empty(mazestack *p) //p为所要判断的指针
{
if(p->next==NULL){
return 1; //栈空,返回1
}
else return 0; /栈不空,返回0
}
改变路径前进方向
int nextpos(int *i,int *j,int di) //i,j为迷宫坐标,di为下一步路径的方向
{
switch(di){
case 1: *i=*i;*j=*j+1;break; //di=1 ,下一步向东
case 2: *i=*i+1;*j=*j;break; //di=2 ,下一步向南
case 3: *i=*i;*j=*j-1;break; //di=3 , 下一步向西
case 4: *i=*i-1;*j=*j;break; //di=4 , 下一步向北
}
return 1;
}
求迷宫路径的算法
mazestack * maze(int i1,int j1,int i2,int j2) //i1,j1为入口坐标,i2,j2为出口坐标
{
int a[10][10]={ 0,0,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,0,1,0,
0,1,1,0,1,1,1,0,1,0,
0,1,1,1,1,0,0,1,1,0,
0,1,0,0,0,1,1,1,1,0,
0,1,1,1,0,1,1,1,1,0,
0,1,0,1,1,1,0,1,1,0,
0,1,0,0,0,1,0,0,1,0,
0,0,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0}; //具体迷宫形式
int i=i1,j=j1;
int k;
mazestack * p;
p=creat(); //建立栈
do{
if(a[i][j]==1){ //判断路径是否已经经过
a[i][j]=5; //没有经过,则将该坐标进行标记
p=push(p,i,j,a[i][j]); //将该坐标点压入栈中
if(i==i2&&j==j2){ //判断压入坐标是否为终点
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(a[i][j]>1){
a[i][j]=5;
printf(" %d ",a[i][j]);
}
else printf(" %d ",a[i][j]);
}
printf("\n\n");
} //压入坐标是终点,将走迷宫图输出,其中路径值为5

return p; //返回栈顶指针
}
nextpos(&i,&j,1); //压入坐标不是终点,将坐标点向东移动一步
}
else{ //路径已经经过
if(!empty(p)){
p=pop(p,&i,&j,&k); //退回一步
a[i][j]=k;
while(a[i][j]==4&&!empty(p)) //判断该坐标周围是否还有通路
{
a[i][j]=1;
p=pop(p,&i,&j,&k);
a[i][j]=k; //没有通路,将其坐标置回成没有经过的路,退回到上一步
}
if(a[i][j]<4){
a[i][j]++;
p=push(p,i,j,a[i][j]);
nextpos(&i,&j,a[i][j]);
} //存在通路,则向下一步方向前进
else if(a[i][j]>4){
a[i][j]=2;
p=push(p,i,j,a[i][j]);
nextpos(&i,&j,a[i][j]);
} //只经过一次的通路,下一步向南走
}
}
}while(!empty(p)) ;
return NULL;
}
主函数算法
main()
{
int i1,i2,j1,j2;
int m,n,l;
int num=0;
mazestack * ma;
printf("input start point\n");
scanf("%d,%d",&i1,&j1); //输入起点
printf("input end point\n");
scanf("%d,%d",&i2,&j2); //输入终点
ma=maze(i1,j1,i2,j2); //求解迷宫
if(ma==NULL){
printf("There is no way");
} //空栈,说明没有路经
else{
while(!empty(ma)){
ma=pop(ma,&m,&n,&l);
printf("(%d,%d) ",m,n);
num++;
} //输出路径结果和步长
printf("the step is %d",num);
}
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
2
为什么不尝试一下用静态分配的空间来实现呢?
2007-12-18 09:14
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大哥 可以详细讲下么
2007-12-18 10:12
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
汇编也可以用malloc分配内存的
2007-12-18 14:14
0
雪    币: 290
活跃值: (11)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
WIN32编程么?可以用
HeapAlloc 函数
2007-12-18 18:43
0
游客
登录 | 注册 方可回帖
返回
//