签到

06月21日
尚未签到

共有回帖数 0

    做月子

    等级:
    #include stdio.h
    #include stdlib.h  
    #define N 6                              //6*6迷宫(不得更改)
    #define INIT_STACK_SIZE    2*N           //初始分配栈的大小  
    #define INCREMENT_SIZE      N            //栈大小增量  

    //迷宫中的块
    typedef struct {
          char mark;      //'0'可通 , '1'墙壁
          char visited;   //标记是否访问过  
          }block;          
    //栈元素          
    typedef struct {    
           int i;        //行  
           int j;        //列
           }s_elem;    
    //栈        
    typedef struct {
         s_elem *base;                      //存放所有路径  
         s_elem *shortest_path;             //存放最短路径  
         int top;                           //!指向栈顶元素的下一个位置  
         int stacksize;                     //当前栈的容量  
         }stack;                          

    void AllPath_ShorestPath(block (*maze)[N] ,int i,int j);
    int Position(int *i ,int *j,int count);
    void Output_AllPath(stack *ps);
    void Output_ShorestPath(stack *ps);
    int Initstack(stack *ps);
    int Push(stack *ps,int i,int j);
    int Pop(stack *ps);

    int MIN=100;   //MIN记录当前所求得的最短路径              
    stack StackPath;   // 存放路径  
    int main(void)
    {
       int i,j;  
       block maze[N][N]={'1','0','1','0','1','0','1','0','1','0','1','0',
                         '1','0','0','0','0','0','0','0','0','0','1','0',
                         '1','0','0','0','0','0','0','0','0','0','1','0',
                         '1','0','0','0','1','0','1','0','0','0','1','0',
                         '1','0','1','0','0','0','0','0','0','0','1','0',
                         '1','0','1','0','1','0','1','0','1','0','1','0'};
       maze[1][1].visited='1';
       
        //输出迷宫                  
       for(i=0;iN;i++)
       {  
           for(j=0;jN;j++)
               printf("%c ",maze[j].mark);  
           if(i!=N-1) putchar(10);
       }  
       printf("(起点[2][2],终点[%d][%d])nnn",N-1,N-1);  
       //求所有路径和最短路径并输出  
       puts("                        所有路径:");                
       Initstack(&StackPath);
       Push(&StackPath,1,1);  
       AllPath_ShorestPath(maze ,1,1);
       Output_ShorestPath(&StackPath);
       //释放申请的内存  

    free(StackPath.base);
       free(StackPath.shortest_path);
       
       getchar();  
       return 0;
    }

    void AllPath_ShorestPath (block (*maze)[N] ,int i,int j)     //从 maze[j] 开始深度优先遍历  
    {
        int count=1;
        int n=i,m=j;    //保存当前位置  
        while(Position(&i,&j,count))
        {
              if(i==N-2 && j==N-2)  //终点
              {
                 if(!Push(&StackPath,i,j)) exit(1);                              
                 Output_AllPath(&StackPath);
                 if(!Pop(&StackPath))   exit(1);  
              }                      
              else if(maze[j].mark=='0' && maze[j].visited=='0')  //可通并且未访问过  
              {
                 maze[j].visited='1';      //标记为访问过  
                 if(!Push(&StackPath,i,j)) exit(1);
                 AllPath_ShorestPath(maze,i,j);
                 if(!Pop(&StackPath))   exit(1);              
                 maze[j].visited='0';                  
              }  
              i=n;j=m;                 //恢复当前位置  
              count++;



        } //end while    
    }

    int Position(int *i ,int *j,int count)  // i行  j列  
    {
       switch(count)
       {
           case 1:(*j)++;      //right
                   return 1;
           case 2:(*i)++;      //down
                   return 1;
           case 3:(*j)--;      //left
                   return 1;
           case 4:(*i)--;      //up
                   return 1;        
           default:return 0;      
          }  
    }

    void Output_AllPath(stack *ps)
    {
        int i=0,k=0;
        s_elem  *base=ps-base;

        for(i=0;i  ps-top;base++,i++)            //输出一条路径  
             printf("[%d][%d] ",base-i+1,base-j+1);
        putchar(10); putchar(10);
        //求最短路径  
        if(MIN  ps-top-1)      
        {
             for(k=0;k  ps-top;k++)
                   ps-shortest_path[k]=ps-base[k];  
             MIN=ps-top-1;
        }                    
    }            

    void Output_ShorestPath(stack *ps)
    {
        int k=0;
        s_elem  *p=ps-shortest_path;
         
        printf("nnn                        最短路径:nn");  


      for(k=0;k = MIN;k++,p++)
             printf("[%d][%d] ",p-i+1,p-j+1);
    }
     
     
    //栈函数            
    int Initstack(stack *ps)                
    {
       ps-base=(s_elem *)malloc(sizeof(s_elem)*INIT_STACK_SIZE);
       ps-shortest_path=(s_elem *)malloc(sizeof(s_elem)*INIT_STACK_SIZE);
       if(!ps-base||!ps-shortest_path)
       {
           puts("内存不足!!!");  
           return 0;
       }
       ps-top=0;    //空栈  
       ps-stacksize=INIT_STACK_SIZE;
       return 1;
    }

    int Push(stack *ps,int i,int j)
    {
       int top=ps-top;
       
       if(ps-top == ps-stacksize)     //栈满                                
       {
             ps-base=(s_elem *)realloc(ps-base,sizeof(s_elem)*(INIT_STACK_SIZE+INCREMENT_SIZE));  
             ps-shortest_path=(s_elem *)realloc(ps-shortest_path,sizeof(s_elem)*(INIT_STACK_SIZE+INCREMENT_SIZE));
             if(!ps-base ||!ps-shortest_path)
             {
                puts("内存不足!!!");  
                return 0;
             }
             ps-stacksize+=INCREMENT_SIZE;
       }
       ps-base[top].i=i;  ps-base[top].j=j;
       ps-top++;    
       return 1;
    }                                
                                                                                                                                                   
    int Pop(stack *ps)
    {
       if(ps-top == 0)   //栈空  
       {
           puts("空栈!!!");  
           return 0;
       }
       ps-top--;
       
       return 1;
    }                                            



    编译通过。        

           
           
    这是文本形式,最好做成图形迷宫。
    但是搞乐半天,还不清楚怎么玩丫。
    LZ在程序中用到乐堆栈的内容

    楼主 2016-01-08 10:13 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知