zoukankan      html  css  js  c++  java
  • 数据结构实验2-迷宫

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 typedef enum { ERROR, OK } Status;
      4 typedef struct
      5 {
      6     int row, line;
      7 }PosType;
      8 
      9 typedef struct
     10 {
     11     int  di, ord;
     12     PosType seat;
     13 }SElemType;
     14 
     15 typedef struct
     16 {
     17     SElemType * base;
     18     SElemType * top;
     19     int        stacksize;
     20 }SqStack;
     21 
     22 Status InitStack(SqStack &S);
     23 Status Push(SqStack &S, SElemType &a);
     24 Status Pop(SqStack &S, SElemType &a);
     25 Status StackEmpty(SqStack S);
     26 Status MazePath(int maze[12][12], SqStack &S, PosType start, PosType end);
     27 void Initmaze(int maze[12][12], int size);
     28 void printmaze(int maze[12][12], int size);
     29 Status Pass(int maze[12][12], PosType CurPos);
     30 void Markfoot(int maze[12][12], PosType CurPos);
     31 PosType NextPos(PosType CurPos, int Dir);
     32 void printpath(int maze[12][12], SqStack S, int size);
     33 void main(void)
     34 {
     35     SqStack S;
     36     int size, maze[12][12];
     37     for (int n = 0; n < 10; n++)
     38     {
     39         printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于10):
    ");
     40         scanf_s("%d", &size);
     41         if (size < 1 || size>10)
     42         { 
     43             printf("输入错误!");
     44             return;
     45         }
     46         Initmaze(maze, size);
     47         printmaze(maze, size);
     48         PosType start, end;
     49         printf("输入入口行坐标和列坐标:");
     50         scanf_s("%d", &start.row); 
     51         scanf_s("%d", &start.line);
     52         printf("输入出口行坐标和列坐标:");
     53         scanf_s("%d", &end.row);
     54         scanf_s("%d", &end.line);
     55         if (MazePath(maze, S, start, end))
     56             printpath(maze, S, size);
     57         else
     58             printf("找不到通路!
    
    ");
     59     }
     60 }
     61 Status MazePath(int maze[12][12], SqStack &S, PosType start, PosType end)
     62 {
     63     PosType curpos;
     64     int curstep;
     65     SElemType e;
     66     InitStack(S);
     67     curpos = start;
     68     curstep = 1;
     69     do {
     70         if (Pass(maze, curpos))
     71         {
     72             Markfoot(maze, curpos);//如果0可以通过,则标记为1
     73             e.di = 1;//从第一个方向开始
     74             e.ord = curstep;
     75             e.seat = curpos;
     76             Push(S, e);//放入栈S
     77             if (curpos.row == end.row && curpos.line == end.line)//到达目的地,成功
     78                 return OK;
     79             curpos = NextPos(curpos, 1);//继续向下一个探索
     80             curstep++;
     81         }
     82         else//不能通过的情况
     83         {
     84             if (!StackEmpty(S))//栈不为空
     85             {
     86                 Pop(S, e);//弹出栈元素,改变方向
     87                 while (e.di == 4 && !StackEmpty(S))
     88                 {
     89                     Markfoot(maze, e.seat);//标记为1
     90                     Pop(S, e);//弹出e
     91                 }
     92                 if (e.di < 4)
     93                 {
     94                     e.di++;
     95                     Push(S, e);
     96                     curpos = NextPos(e.seat, e.di);
     97                 }
     98             }
     99         }
    100     } while (!StackEmpty(S));
    101     return ERROR;
    102 }
    103 void Initmaze(int maze[12][12], int size)
    104 {
    105     char select;
    106     printf("选择创建方式 A:自动生成 B:手动创建
    ");
    107 label:scanf_s("%c", &select);
    108     if (select == 'a' || select == 'A')
    109     {
    110         for (int i = 0; i < size + 2; i++)
    111             maze[0][i] = 1;
    112         for (int i = 1; i < size + 1; i++)
    113         {
    114             maze[i][0] = 1;
    115             for (int j = 1; j < size + 1; j++)
    116                 maze[i][j] = rand() % 2;
    117             maze[i][size + 1] = 1;
    118         }
    119         for (int i = 0; i < size + 2; i++)
    120             maze[size + 1][i] = 1;
    121     }
    122     else if (select == 'b' || select == 'B')
    123     {
    124         printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):
    ", size, size);
    125         for (int i = 0; i < size + 2; i++)maze[0][i] = 1;
    126         for (int i = 1; i < size + 1; i++)
    127         {
    128             maze[i][0] = 1;
    129             for (int j = 1; j < size + 1; j++)
    130                 scanf_s("%d", &maze[i][j]);
    131             maze[i][size + 1] = 1;
    132         }
    133         for (int i = 0; i < size + 2; i++)
    134             maze[size + 1][i] = 1;
    135     }
    136     else if (select == '
    ')
    137         goto label;
    138     else printf("输入错误!");
    139 }
    140 void printmaze(int maze[12][12], int size)//
    141 {
    142     printf("
    
    ");
    143     printf("显示所建的迷宫(#表示外面的墙):
    ");
    144     for (int i = 0; i < size + 2; i++)
    145         printf("%c ", '#');
    146     printf("
    ");
    147     for (int i = 1; i < size + 1; i++)
    148     {
    149         printf("%c ", '#');
    150         for (int j = 1; j < size + 1; j++)
    151         {
    152             printf("%d ", maze[i][j]);
    153         }
    154         printf("%c", '#');
    155         printf("
    ");
    156     }
    157     for (int i = 0; i < size + 2; i++)
    158         printf("%c ", '#');
    159     printf("
    ");
    160 
    161 }
    162 
    163 void printpath(int maze[12][12], SqStack S, int size)
    164 {
    165     printf("
    
    通路路径为:
    ");
    166     SElemType * p = S.base;
    167     while (p != S.top)
    168     {
    169         maze[p->seat.row][p->seat.line] = 2;
    170         p++;
    171     }
    172     for (int i = 0; i < size + 2; i++)
    173         printf("%c ", '#'); printf("
    ");
    174     for (int i = 1; i < size + 1; i++)
    175     {
    176         printf("%c ", '#');
    177         for (int j = 1; j < size + 1; j++)
    178         {
    179             if (maze[i][j] == 2) 
    180                 printf("%c ", '0');
    181             else              
    182                 printf(" ");
    183         }
    184         printf("%c", '#');
    185         printf("
    ");
    186     }
    187     for (int i = 0; i < size + 2; i++)
    188         printf("%c ", '#'); 
    189     printf("
    
    ");
    190 
    191 }
    192 
    193 Status Pass(int maze[12][12], PosType CurPos)
    194 {
    195     if (maze[CurPos.row][CurPos.line] == 0)
    196         return OK;
    197     else 
    198         return ERROR;
    199 }
    200 void Markfoot(int maze[12][12], PosType CurPos)
    201 {
    202     maze[CurPos.row][CurPos.line] = 1;
    203 }
    204 PosType NextPos(PosType CurPos, int Dir)
    205 {
    206     PosType ReturnPos;
    207     switch (Dir)
    208     {
    209     case 1:
    210         ReturnPos.row = CurPos.row;
    211         ReturnPos.line = CurPos.line + 1;
    212         break;
    213     case 2:
    214         ReturnPos.row = CurPos.row + 1;
    215         ReturnPos.line = CurPos.line;
    216         break;
    217     case 3:
    218         ReturnPos.row = CurPos.row;
    219         ReturnPos.line = CurPos.line - 1;
    220         break;
    221     case 4:
    222         ReturnPos.row = CurPos.row - 1;
    223         ReturnPos.line = CurPos.line;
    224         break;
    225     }
    226     return ReturnPos;
    227 }
    228 Status InitStack(SqStack &S)
    229 {
    230     S.base = (SElemType *) malloc(100 * sizeof(SElemType));
    231     if (!S.base)return ERROR;
    232     S.top = S.base;
    233     S.stacksize = 100;
    234     return OK;
    235 }
    236 Status Push(SqStack &S, SElemType &a)
    237 {
    238     *S.top++ = a;
    239     return OK;
    240 }
    241 Status Pop(SqStack &S, SElemType &a)
    242 {
    243     if (S.top == S.base)
    244         return ERROR;
    245     a = *--S.top;
    246     return OK;
    247 }
    248 
    249 Status StackEmpty(SqStack S)
    250 {
    251     if (S.top == S.base)
    252         return OK;
    253     return ERROR;
    254 }
  • 相关阅读:
    Java Native Method
    SQL语句优化
    Ibatis的环境搭建以及遇到的问题解决
    Java 构建器
    SpringMVC自定义视图 Excel视图和PDF视图
    java 枚举的常见使用方法
    mysql 根据某些字段之和排序
    MFC The Screen Flickers When The Image Zoomed
    How To Debug Qmake Pro File
    Gcc And MakeFile Level1
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3416874.html
Copyright © 2011-2022 走看看