|
| 1 | +/* 实验十三 迷宫问题 */ |
| 2 | + |
| 3 | +#include <stdio.h> |
| 4 | +#define MaxSize 100 |
| 5 | +#define M 8 |
| 6 | +#define N 8 |
| 7 | +int mg[M + 2][N + 2] = |
| 8 | + { |
| 9 | + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, |
| 10 | + {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, |
| 11 | + {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, |
| 12 | + {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, |
| 13 | + {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, |
| 14 | + {1, 0, 0, 0, 1, 0, 0, 0, 0, 1}, |
| 15 | + {1, 0, 1, 0, 0, 0, 1, 0, 0, 1}, |
| 16 | + {1, 0, 1, 1, 1, 0, 1, 1, 0, 1}, |
| 17 | + {1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, |
| 18 | + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; //构造地图 |
| 19 | +typedef struct |
| 20 | +{ |
| 21 | + int i; //当前方块的行号 |
| 22 | + int j; //当前方块的列号 |
| 23 | + int di; //di是下一可走相邻方位的方位号---上下左右的标记 |
| 24 | +} Box; |
| 25 | +typedef struct |
| 26 | +{ |
| 27 | + Box data[MaxSize]; //是用来存储位置坐标的,当MaxSize<位置坐标的数目时,则程序出错,停止运行 |
| 28 | + int top; //栈顶指针 |
| 29 | +} StType; //定义栈类型 |
| 30 | +//该栈中:每一个位置用于存储Box,该栈对应了一个int型的top作为指针,依次移动,方便对栈中每一个位置进行操作,而Box中,存储了该迷宫位置的横坐标,纵坐标,和从上一位置移动到该位置所对应的方向数值 |
| 31 | +int mgpath(int xi, int yi, int xe, int ye) //求解路径为:(xi,yi)->(xe,ye) |
| 32 | + //初位置横坐标,初位置纵坐标,终点横坐标,终点纵坐标 |
| 33 | +{ |
| 34 | + int i, j, k, di, find; |
| 35 | + StType st; //定义栈st |
| 36 | + st.top = -1; //初始化栈顶指针 |
| 37 | + st.top++; //初始方块进栈 |
| 38 | + st.data[st.top].i = xi; //栈底一号存入横坐标数值 |
| 39 | + st.data[st.top].j = yi; //栈底一号存入纵坐标数值 |
| 40 | + st.data[st.top].di = -1; //???????????????????????????????? |
| 41 | + mg[xi][yi] = -1; |
| 42 | + while (st.top > -1) //栈不空时循环 |
| 43 | + { |
| 44 | + i = st.data[st.top].i; |
| 45 | + j = st.data[st.top].j; |
| 46 | + di = st.data[st.top].di; //取栈顶方块 |
| 47 | + if (i == xe && j == ye) //找到了出口,输出路径 |
| 48 | + { |
| 49 | + printf("迷宫路径如下:\n"); |
| 50 | + for (k = 0; k <= st.top; k++) |
| 51 | + { |
| 52 | + printf("\t(%d,%d)", st.data[k].i, st.data[k].j); |
| 53 | + if ((k + 1) % 5 == 0) //每输出5个元素,就换行 |
| 54 | + printf("\n"); |
| 55 | + } |
| 56 | + printf("\n"); |
| 57 | + return 0; //找到路径之后,将所有路径打印出来,然后,程序结束 |
| 58 | + } |
| 59 | + find = 0; |
| 60 | + while (di < 4 && find == 0) //找下一个可走方块 |
| 61 | + { |
| 62 | + di++; |
| 63 | + switch (di) |
| 64 | + { |
| 65 | + case 0: //向上走 |
| 66 | + i = st.data[st.top].i - 1; |
| 67 | + j = st.data[st.top].j; |
| 68 | + break; |
| 69 | + case 1: //向右走 |
| 70 | + i = st.data[st.top].i; |
| 71 | + j = st.data[st.top].j + 1; |
| 72 | + break; |
| 73 | + case 2: //向下走 |
| 74 | + i = st.data[st.top].i + 1; |
| 75 | + j = st.data[st.top].j; |
| 76 | + break; |
| 77 | + case 3: //向左走 |
| 78 | + i = st.data[st.top].i; |
| 79 | + j = st.data[st.top].j - 1; |
| 80 | + break; |
| 81 | + } |
| 82 | + if (mg[i][j] == 0) |
| 83 | + find = 1; //mg[i][j]==0说明:该点可以走--------------(该点为此时所在点的下一预判点) |
| 84 | + } |
| 85 | + if (find == 1) //找到了下一个可走方块 |
| 86 | + { |
| 87 | + st.data[st.top].di = di; //修改原栈顶元素的di值 |
| 88 | + st.top++; //下一个可走方块进栈 |
| 89 | + st.data[st.top].i = i; |
| 90 | + st.data[st.top].j = j; |
| 91 | + st.data[st.top].di = -1; //再次初始化方向数值 |
| 92 | + mg[i][j] = -1; //避免重复走到该方块-----------------------//让每一个点都变成起点,因此,既满足递归的条件,也避免重复走到该位置 |
| 93 | + } |
| 94 | + else //没有路径可走,则退栈-----------???????????为什么要退栈?不是刚刚只判断了一个方向吗? |
| 95 | + { |
| 96 | + mg[st.data[st.top].i][st.data[st.top].j] = 0; //让该位置变为其他路径可走方块 |
| 97 | + st.top--; //将该方块退栈 |
| 98 | + } |
| 99 | + } |
| 100 | + return (0); //表示没有可走路径,返回0 |
| 101 | +} |
| 102 | +int main() |
| 103 | +{ |
| 104 | + int x, y, k, t; |
| 105 | + printf("终点坐标为:(8,8)\n"); |
| 106 | + while (1) |
| 107 | + { |
| 108 | + printf("请输入起点坐标:\n"); |
| 109 | + printf("(横坐标范围:0~9,纵坐标范围:0~9)\n"); |
| 110 | + scanf("%d %d", &x, &y); |
| 111 | + if (mg[x][y] == 1) |
| 112 | + { |
| 113 | + printf("输入坐标有误,该位置为墙,请重新输入:\n"); |
| 114 | + } |
| 115 | + else |
| 116 | + { |
| 117 | + break; |
| 118 | + } |
| 119 | + } |
| 120 | + mgpath(x, y, M, N); |
| 121 | + printf("\n\n图像表示:\n"); |
| 122 | + for (t = 0; t < 10; t++) |
| 123 | + { |
| 124 | + printf("\t\t"); |
| 125 | + for (k = 0; k < 10; k++) |
| 126 | + { |
| 127 | + if (mg[t][k] == 1) |
| 128 | + { |
| 129 | + printf("#"); |
| 130 | + } |
| 131 | + else if (mg[t][k] == 0) |
| 132 | + { |
| 133 | + printf(" "); |
| 134 | + } |
| 135 | + else |
| 136 | + { |
| 137 | + printf("o"); |
| 138 | + } |
| 139 | + } |
| 140 | + if (k == 10) |
| 141 | + { |
| 142 | + printf("\n"); |
| 143 | + } |
| 144 | + } |
| 145 | + printf("\n此时,o所代表的图标为迷宫行走路径!!!\n"); |
| 146 | + return 0; |
| 147 | +} |
0 commit comments