C语言,数据结构,迷宫算法,迪迦奥特曼

#include<stdio.h> 
#include<stdlib.h> 
#define  maxinit 1000
#define fenpei 1000
#define  true 1
#define  false 0
#define  ok 1
#define  error 0

int ditu[10][10]={

{1,1,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,1}

};

int leftstep=1;


typedef int  Status; 

typedef struct{
    
    
    
    int x;
    int y;
    
}zuobiao;


typedef struct{
    
    
    int lj;
    zuobiao e;
    int fx;
    
    
    
}bloockpostion;

typedef struct{
        bloockpostion *top;

    bloockpostion *data;
    int nowsize;
    
    
    
}sqstack;

//留下足迹

void printi(int a,int b){

int i;
int j;
for(i=0;i<a;i++){
    
    
    
    
 for(j=0;j<b;j++){
     
     printf("%d     ",ditu[i][j]);
 
     if(j==9){
     
     printf("\n");
 
 }

 }
 
 
}


}

Status stackempty(sqstack s){
    
    
    
    
    
    
    
    
    if(s.top==s.data)
    
    return true;
    else
    return false;
    
}

void printitlast(zuobiao x){
    //现在的数,迪迦 
    ditu[x.x][x.y]=leftstep; 
    
    
    
    

//输入坐标以后传到这里判断

Status pass(zuobiao j)
{
    
    
    if(ditu[j.x][j.y]==1)
     return ok;
     else 
     return error;
     
     
    
    
}


zuobiao nextstep(zuobiao h,int fx){
    
    zuobiao ggg[4]={{0,1},{1,0},{0,-1},{-1,0}};
    h.x+=ggg[fx].x;
    h.y+=ggg[fx].y;
    return h;
    
    
}


//标记不能走的为-1
 
void markcant(zuobiao x)

{
    
    ditu[x.x][x.y]=-1;
    
    
    
    
}


Status initstack(sqstack *s)
{
    
    
    s->data=(bloockpostion *)malloc(sizeof(bloockpostion)*maxinit);
    if(!s->data)
    exit(-1);
    s->top=s->data;
    s->nowsize=maxinit;
    printf("初始化成功,大小为:%d\n",s->nowsize); 

      return ok;
    
}

Status push(sqstack *s,bloockpostion e)
{
    
    if(s->top-s->data>=s->nowsize)
    {
        
        s->data=(bloockpostion *)realloc(s->data,sizeof(bloockpostion)*(s->nowsize+maxinit));
            
            if(!s->data){
                         printf("重新失败");

                         exit(-1);

            }
            
           s->top=s->data+s->nowsize;
            s->nowsize+=maxinit;
        printf("重新分配成功");
    }
 
        *(s->top++)=e;
//        printf("%d,%d,%d,%d",e.e.x, e.e.y, e.fx,e.lj);

        
        
        
        
         return ok;
         
  
    
    
}

Status pop(sqstack *s){
    
    
    
    
    if(s->top==s->data)
    printf("出栈失败"); 
             return error;
    s->top--;
    return ok;
        
    

Status havepath(zuobiao begin,zuobiao final){
    
    
    sqstack s;
    //现在走到哪了 
     zuobiao nowzuobiao;
     
     bloockpostion l;
     initstack(&s);
     
     nowzuobiao=begin;
     
     
     //开始找了
     
     
     
     
     
     
     do{
         
         
         //是否可通当前坐标 
         if(pass(nowzuobiao)){
             
             
             //留下足迹
             
             
             printitlast(nowzuobiao);
               l.e.x=nowzuobiao.x;
               l.e.y=nowzuobiao.y;
               l.lj=leftstep;
            l.fx=0;
            push(&s,l);
            leftstep++;
            if(nowzuobiao.x==final.x&&nowzuobiao.y==final.y)
             return true;
             
             nowzuobiao=nextstep(l.e,l.fx);
             
             
             
         }
         
         else{
             if(!stackempty(s))
             
             
             {
             pop(&s);
             leftstep--;
             while(l.fx==3&&!stackempty(s))    {
                 markcant(l.e);
                 pop(&s);
                 leftstep--;
                 
                 
                 
                 
             }
                 if(l.fx<3){
                     
                     l.fx++;
                     push(&s,l);
                     leftstep++;
                     nowzuobiao=nextstep(l.e,l.fx);

                 
                 }
             
                 
             }
             
             
             
         }
         
         
         
         
         
         
         
     }while(!stackempty(s));
     
     
     
     return false;
      
    
    


int main(){
    
//    起点终点坐标结构 
zuobiao begin;
zuobiao final;
//    sqstack s;
//
//    initstack(&s);

//
//bloockpostion b;
//      b.e.x=3;
//      b.e.y=4;
//      b.fx=0;
//      b.lj=1;
//
//
//push(&s,b);
//push(&s,b);

//pop(&s);
//
//


printf("请输入起点");
 
scanf("%d,%d",&begin.x,&begin.y); 
printf("请输入终点");
scanf("%d,%d",&final.x,&final.y); 

//判断是否有路线
if(havepath(begin,final))


{
    
    
    printf("有路线如下\n");
    //打印出来
     
    
    printi(10,10);
    
 } 
else{
    
    
        printf("找不到");
    

 
    return 0; 
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值