zoukankan      html  css  js  c++  java
  • 迷宫问题

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #define error 0
      4 #define ok 1
      5 #define no 0
      6 typedef struct
      7 {
      8     int i,j;
      9     int foot;
     10     int mark;
     11 }postype;
     12 typedef struct
     13 {
     14     int ord;
     15     int di;
     16     postype seat;
     17 }selemtype;
     18 typedef struct snode
     19 {
     20     selemtype data;
     21     struct snode*next;
     22 }linkstack;
     23 int initstack(linkstack*&s)
     24 {
     25     s=NULL;
     26     return ok;
     27 }
     28 int push(linkstack *&s,selemtype e)
     29 {
     30     linkstack *p;
     31     p=(linkstack*)malloc(sizeof(linkstack));
     32     p->data=e;
     33     p->next=s;
     34     s=p;
     35     return ok;
     36 }
     37 int stackempty(linkstack*s)
     38 {
     39     if(s==NULL)
     40         return ok;
     41     return no;
     42 }
     43 int pop(linkstack*&s,selemtype &e)
     44 {
     45     linkstack*p;
     46     if(!s)
     47         return error;
     48     p=s;
     49     e=s->data;
     50     s=s->next;
     51     free(p);
     52     return ok;
     53 }
     54 linkstack*mazepath(postype maze[11][11],postype start,postype end)
     55 {
     56     linkstack*s;
     57     postype curpos=start;
     58     int curstep=1;
     59     initstack(s);
     60     selemtype e;
     61     do
     62     {
     63         if(curpos.foot&&curpos.mark)
     64         {
     65             curpos.foot=maze[curpos.i][curpos.j].foot=0;
     66             e.ord=curstep;
     67             e.seat=curpos;
     68             e.di=1;
     69             push(s,e);
     70             if(curpos.i==end.i&&curpos.j==end.j)
     71                 return s;
     72             curpos=maze[e.seat.i][e.seat.j+1];
     73             curstep++;
     74         }
     75         else
     76         {
     77             if(!stackempty(s))
     78             {
     79                 pop(s,e);
     80                 while(e.di==4&&!stackempty(s))
     81                 {
     82                     e.seat.mark=0;
     83                     pop(s,e);
     84                 }
     85                 if(e.di<4)
     86                 {
     87                     e.di++;
     88                     push(s,e);
     89                     if(e.di==1)
     90                         curpos=maze[e.seat.i][e.seat.j+1];
     91                     if(e.di==2)
     92                         curpos=maze[e.seat.i+1][e.seat.j];
     93                     if(e.di==3)
     94                         curpos=maze[e.seat.i][e.seat.j-1];
     95                     if(e.di=4)
     96                         curpos=maze[e.seat.i-1][e.seat.j];
     97                 }
     98             }
     99         }
    100     }while(!stackempty(s));
    101     return no;
    102 }
    103 void main()
    104 {
    105     postype maze[11][11];
    106     int i,j;
    107     linkstack*s;
    108     selemtype e;
    109     char a[11][11]=
    110     {
    111         {'#','#','#','#','#','#','#','#','#','#'},
    112         {'#',' ',' ','#',' ',' ',' ','#',' ','#'},
    113         {'#',' ',' ','#',' ',' ',' ','#',' ','#'},
    114         {'#',' ',' ',' ',' ','#','#',' ',' ','#'}, 
    115         {'#',' ','#','#','#',' ',' ',' ',' ','#'}, 
    116         {'#',' ',' ',' ','#',' ',' ',' ',' ','#'}, 
    117         {'#',' ','#',' ',' ',' ','#',' ',' ','#'}, 
    118         {'#',' ','#','#','#',' ','#','#',' ','#'}, 
    119         {'#','#',' ',' ',' ',' ',' ',' ',' ','#'},  
    120         {'#','#','#','#','#','#','#','#','#','#'}
    121     }; 
    122     int b[11][11]=
    123     {
    124         0,0,0,0,0,0,0,0,0,0, 
    125         0,0,0,0,0,0,0,0,0,0, 
    126         0,0,0,0,0,0,0,0,0,0, 
    127         0,0,0,0,0,0,0,0,0,0, 
    128         0,0,0,0,0,0,0,0,0,0, 
    129         0,0,0,0,0,0,0,0,0,0, 
    130         0,0,0,0,0,0,0,0,0,0, 
    131         0,0,0,0,0,0,0,0,0,0, 
    132         0,0,0,0,0,0,0,0,0,0, 
    133         0,0,0,0,0,0,0,0,0,0,
    134     };
    135     printf("原迷宫:
    
    ");
    136     for(i=0;i<10;i++)
    137     {
    138         for(j=0;j<10;j++)
    139             printf("%c ",a[i][j]);
    140         printf("
    ");
    141     }
    142     for(i=0;i<=10;i++)
    143     {
    144         for(j=0;j<=10;j++)
    145         {
    146             maze[i][j].i=i;
    147             maze[i][j].j=j;
    148             if(a[i][j]=='#')
    149                 maze[i][j].mark=0;
    150             else
    151                 maze[i][j].mark=1;
    152             maze[i][j].foot=1;
    153         }
    154     }
    155     s=mazepath(maze,maze[1][1],maze[8][8]);
    156     while(!stackempty(s))
    157     {
    158         pop(s,e);
    159         b[e.seat.i][e.seat.j]=1;
    160     }
    161     printf("路径:");
    162     for(i=0;i<10;i++)
    163     {
    164         for(j=0;j<10;j++)
    165             printf("%d ",b[i][j]);
    166         printf("
    ");
    167     }
    168 }
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #define TRUE 1
      5 #define FALSE 0
      6 #define OK 1
      7 #define ERROR 0
      8 #define OVERFLOW -2
      9 typedef int Status;
     10 //stack.h
     11 //#include "base.h"
     12 #define INIT_SIZE 100 //存储空间初始分配量
     13 #define INCREMENT 10  //存储空间分配增量
     14 typedef struct{       //迷宫中r行c列的位置
     15          int r;
     16          int c;
     17 }PostType;
     18 typedef struct{
     19          int ord;      //当前位置在路径上的序号
     20          PostType seat;//当前坐标
     21          int di;       //往下一坐标的方向
     22 }SElemType;        //栈元素类型
     23 typedef struct{
     24          SElemType* base;//栈基址,构造前销毁后为空
     25          SElemType* top;//栈顶
     26          int stackSize;  //栈容量
     27 }Stack;             //栈类型
     28 Status InitStack(Stack &S){  //构造空栈s
     29          S.base=(SElemType*)malloc(INIT_SIZE *sizeof(SElemType));
     30          if(!S.base)
     31                    exit(OVERFLOW);//存储分配失败
     32          S.top=S.base;
     33          S.stackSize=INIT_SIZE;
     34          return OK;
     35 }//InitStack
     36 
     37 Status StackEmpty(Stack S){         
     38 //若s为空返回TRUE,否则返回FALSE
     39          if(S.top==S.base)
     40                    return TRUE;
     41          return FALSE;
     42 }//StackEmpty
     43 
     44 Status Push(Stack &S,SElemType e){
     45  //插入元素e为新的栈顶元素
     46          if(S.top-S.base >=S.stackSize){//栈满,加空间
     47                    S.base=(SElemType *)realloc(S.base,(S.stackSize+INCREMENT)*sizeof(SElemType));
     48                    if(!S.base)
     49                             exit(OVERFLOW);   //存储分配失败
     50                    S.top=S.base+S.stackSize;
     51                    S.stackSize+=INCREMENT;
     52          }
     53          *S.top++=e;
     54          return OK;
     55 }//push
     56 Status Pop(Stack &S,SElemType &e){//若栈不空删除栈//顶元素用e返回并返回OK,否则返回ERROR
     57          if(S.top==S.base)
     58                    return ERROR;
     59          e=*--S.top;
     60          return OK;
     61 }//Pop
     62 Status DestroyStack(Stack &S)
     63 {//销毁栈S,
     64          free(S.base);
     65          S.top=S.base;
     66          return OK;
     67 }//DestroyStack
     68 
     69 //maze.cpp
     70 //#include "stack.h"
     71 #define MAXLEN 10//迷宫包括外墙最大行列数目
     72 typedef struct{
     73          int r;
     74          int c;
     75          char adr[MAXLEN][MAXLEN];//可取' ''*' '@' '#'
     76 }MazeType;   //迷宫类型
     77 Status InitMaze(MazeType &maze){
     78 //初始化迷宫若成功返回TRUE,否则返回FALSE
     79          int m,n,i,j;
     80          printf("Enter row and column numbers: ");
     81          scanf("%d%d",&maze.r,&maze.c); //迷宫行和列数
     82          for(i=0;i<=maze.c+1;i++){//迷宫行外墙
     83                    maze.adr[0][i]='#';
     84                    maze.adr[maze.r+1][i]='#';
     85          }//for
     86          for(i=0;i<=maze.r+1;i++){//迷宫列外墙
     87                    maze.adr[i][0]='#';
     88                    maze.adr[i][maze.c+1]='#';
     89          }
     90          for(i=1;i<=maze.r;i++)
     91 
     92                    for(j=1;j<=maze.c;j++)
     93 
     94                             maze.adr[i][j]=' ';//初始化迷宫
     95          printf("Enter block's coordinate((-1,-1) to end): ");
     96 
     97          scanf("%d%d",&m,&n);//接收障碍的坐标
     98          while(m!=-1){
     99 
    100                    if(m>maze.r || n>maze.c)//越界
    101                             exit(ERROR);
    102 
    103                    maze.adr[m][n]='#';//迷宫障碍用'#'标记
    104                    printf("Enter block's coordinate((-1,-1) to end): ");
    105 
    106                    scanf("%d%d",&m,&n);
    107 
    108          }//while
    109 
    110          return OK;
    111 
    112 }//InitMaze         
    113 
    114 Status Pass(MazeType maze,PostType curpos){
    115 
    116 //当前位置可通则返回TURE,否则返回FALSE
    117 
    118          if(maze.adr[curpos.r][curpos.c]==' ')//可通
    119                    return TRUE;
    120 
    121          else
    122 
    123                    return FALSE;
    124 
    125 }//Pass
    126 
    127 Status FootPrint(MazeType &maze,PostType curpos){
    128 
    129 //若走过并且可通返回TRUE,否则返回FALSE
    130 
    131 //在返回之前销毁栈S
    132 
    133          maze.adr[curpos.r][curpos.c]='*';//"*"表示可通
    134          return OK;
    135 
    136 }//FootPrint
    137 
    138 PostType NextPos(PostType &curpos,int i){
    139 //指示并返回下一位置的坐标
    140          PostType cpos;
    141          cpos=curpos;
    142          switch(i){        //1.2.3.4分别表示东,南,西,北方向
    143                    case 1 : cpos.c+=1; break;
    144                    case 2 : cpos.r+=1; break;
    145                    case 3 : cpos.c-=1; break;
    146                    case 4 : cpos.r-=1; break;
    147                    default: exit(ERROR);  
    148          }
    149          return cpos;
    150 }//Nextpos
    151 
    152 Status MarkPrint(MazeType &maze,PostType curpos){
    153 //曾走过但不是通路标记并返回OK
    154         maze.adr[curpos.r][curpos.c]='@';//"@"表示曾走过但不通
    155          return OK;
    156 }//MarkPrint
    157 
    158 Status MazePath(MazeType &maze,PostType start,PostType end){
    159 
    160          //若迷宫maze存在从入口start到end的通道则求得一条存放在栈中
    161          //并返回TRUE,否则返回FALSE
    162 
    163          Stack S;
    164 
    165          PostType curpos;
    166 
    167          int curstep;//当前序号,1.2.3.4分别表示东,南,西,北方向
    168          SElemType e;
    169 
    170          InitStack(S);
    171 
    172          curpos=start; //设置"当前位置"为"入口位置"
    173 
    174          curstep=1;   //探索第一步
    175          do{
    176 
    177                    if(Pass(maze,curpos)){//当前位置可以通过,
    178 
    179 //即是未曾走到过的通道
    180                             FootPrint(maze,curpos);//留下足迹
    181                             e.ord=curstep;
    182 
    183                             e.seat=curpos;
    184 
    185                             e.di=1;
    186 
    187                             Push(S,e);              //加入路径
    188                             if(curpos.r==end.r&& curpos.c==end.c)
    189 
    190 if(!DestroyStack(S))//销毁失败
    191 exit(OVERFLOW);
    192 
    193 else 
    194 
    195       return TRUE; //到达出口
    196                             else{
    197 
    198                                      curpos=NextPos(curpos,1); 
    199 
    200 //下一位置是当前位置的东邻
    201                                      curstep++;       //探索下一步
    202                             }//else
    203 
    204                    }//if
    205 
    206                    else{    //当前位置不通
    207                             if(!StackEmpty(S)){
    208 
    209                                      Pop(S,e);
    210 
    211                                 while(e.di==4
    212 
    213 && !StackEmpty(S)){
    214 
    215                                                MarkPrint(maze,e.seat);
    216 
    217                                                Pop(S,e);        
    218 
    219 //留下不能通过的标记,并退一步
    220                                      }//while
    221 
    222                                      if(e.di < 4){
    223 
    224                                                e.di++;//换下一个方向探索
    225                                                Push(S,e);            
    226 
    227                                                curpos=NextPos(e.seat,e.di);//设定当前位置是该
    228 //新方向上的相邻
    229                                      }//if
    230 
    231                             }//if
    232 
    233                    }//else
    234 
    235          }while(!StackEmpty(S));
    236 
    237          if(!DestroyStack(S))//销毁失败
    238             exit(OVERFLOW);             
    239 
    240  else 
    241 
    242             return FALSE;
    243 
    244 }//MazePath
    245 
    246 void PrintMaze(MazeType &maze){
    247 
    248 //将标记路径信息的迷宫输出到终端(包括外墙)
    249 
    250          int i,j;
    251 
    252          printf("
    Show maze path(*---pathway):
    
    ");
    253 
    254          printf("  ");
    255 
    256          for(i=0;i<=maze.r+1;i++)//打印列数名
    257                    printf("%4d",i);
    258 
    259          printf("
    
    ");
    260 
    261          for(i=0;i<=maze.r+1;i++){
    262 
    263                    printf("%2d",i);//打印行名 
    264 
    265                    for(j=0;j<=maze.c+1;j++)
    266 
    267                             printf("%4c",maze.adr[i][j]);//输出迷宫//当前位置的标记          
    268 
    269                    printf("
    
    ");
    270 
    271          }
    272 
    273 }//PrintMaze
    274 
    275  
    276 
    277 void main(){     //主函数
    278          MazeType maze;
    279 
    280          PostType start,end;
    281 
    282          char cmd;
    283 
    284          do{
    285 
    286                    printf("-------FOUND A MAZEPATH--------
    ");
    287 
    288                    if(!InitMaze(maze)){  //初始化并创建迷宫
    289                    printf("
    Initialization errors!!!
    ");
    290 
    291                             exit(OVERFLOW);     //初始化错误
    292                    }
    293 
    294                    do{                 //输入迷宫入口坐标
    295                             printf("
    Enter entrance coordinate of the maze: ");
    296 
    297                             scanf("%d%d",&start.r,&start.c);
    298 
    299                             if(start.r>maze.r || start.c>maze.c){
    300 
    301                                      printf("
    Beyond the maze!!!
    ");
    302 
    303                                      continue;
    304 
    305                             }
    306 
    307                    }while(start.r>maze.r || start.c>maze.c);
    308 
    309                    do{                 //输入迷宫出口坐标
    310                             printf("
    Enter exit coordinate of the maze: ");
    311 
    312                             scanf("%d%d",&end.r,&end.c);
    313 
    314                             if(end.r>maze.r || end.c>maze.c){
    315 
    316                                      printf("
    Beyond the maze!!!
    ");
    317 
    318                                      continue;
    319 
    320                             }
    321 
    322                    }while(end.r>maze.r || end.c>maze.c);
    323 
    324                    if(!MazePath(maze,start,end))//迷宫求解
    325                             printf("
    No path from entrance to exit!
    ");
    326 
    327                    else
    328 
    329                             PrintMaze(maze);//打印路径
    330                    printf("
    Continue?(y/n): ");
    331 
    332                    scanf("%s",&cmd);
    333 
    334          }while(cmd=='y' || cmd=='Y');
    335 
    336 }//main
  • 相关阅读:
    【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings
    8 shell命令之find
    [网络]_[0基础]_[使用putty备份远程数据]
    Cstyle的UEFI导读:第20.0篇 IGD OpRegion interface &amp;&amp; IGD OpRegion PROTOCOL
    Mac下使用MySQL
    Qt中截图功能的实现
    gdb经常使用命令总结
    Graphical Shell with WebShell
    SSH WebShell: SSH在线WEB管理器安装教程
    python—webshell_醉清风xf_新浪博客
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3374962.html
Copyright © 2011-2022 走看看