找到迷宫的所有解

来源:互联网 发布:ubuntu 卸载docker 编辑:程序博客网 时间:2024/05/21 15:43
迷宫:数组M11111111111  11111111   1111111      1111 1  1 1111  1 1   11111   1 1111111   111111111111.做迷宫类题目,首先初始化一个迷宫,上面迷宫中填入1 的结点视为路障,没有填写的地方视为可以走的路。

本题定义一个七行八列的数组迷宫,为了方便算法实现,在最外围再加上“一堵墙”,然后在初始化时就将人放在M(1,1)的位置

墙赋值为1,走过的路标记为2,未走过的路记为0

方位数组:Move1001-100-13.定义一个记录方位的二维数组,存储的方位依次为:南东北西,以人所在的结点为(0,0)来看初始化方位二维数组,

往南走,x记为1,y仍是0,以此类推


代码实现如下:

#include<stdio.h>#include<stdlib.h>#define rol 7//定义迷宫的行#define col 8//定义迷宫的列int Move[4][2] = { { 1,0 },{ 0,1 },{ -1,0 },{ 0,-1 } };//定义四个方向存入二维数组,顺序为:南东北西int M[rol + 2][col + 2] = { { 1,1,1,1,1,1,1,1,1,1 },{ 1,0,0,1,1,1,1,1,1,1 },{ 1,0,0,0,1,1,1,1,1,1 },{ 1,0,0,0,0,0,0,1,1,1 },{ 1,0,1,0,0,1,0,1,1,1 },{ 1,0,0,1,0,1,0,0,0,1 },{ 1,1,1,1,0,0,0,1,0,1 },{ 1,1,1,1,1,1,0,0,0,1 },{ 1,1,1,1,1,1,1,1,1,1 } };//用最笨的办法直接给迷宫赋值//int t[rol + 2][col + 2] = { 0 };//定义一个和迷宫M一样大的迷宫用来存储该结点是否走过,初始化为0,走过的结点赋1int stack[100][2];//定义一个存放路径的栈int top = -1;//定义一个栈顶指针topint cnt = 0;//输出void Print() {int i;printf("第%d组解:\n", ++cnt);printf("(%d,%d)", 1, 1);for (i = 0; i < top + 1; i++) {printf("->(%d,%d)", stack[i][0], stack[i][1]);}printf("\n");}void Maze(int x, int y) {int a = 0, b = 0;if (x == rol&&y == col) {Print();//return 1;//当走到出口时,返回1}else {for (int i = 0; i < 4; i++) {//遍历四个方向a = x + Move[i][0];b = y + Move[i][1];//给a,b赋值if (!M[a][b]) {//如果M[a][b]能走并且没有被走过M[a][b] = 2;//此时给M[a][b]赋2记录此处被走过//入栈top++;stack[top][0] = a;stack[top][1] = b;Maze(a, b);//并且在此处进行调用,走到下一个节点位置M[a][b] = 0;//抹掉标记top--;//出栈}}}}int main(void) {int i, j;stack[0][0] = stack[0][1] = 1;//初始化栈底元素为1,1,即从1,1开始这个节点开始跑for (i = 0; i < rol + 2; i++) {for (j = 0; j < col + 2; j++) {printf("%2d", M[i][j]);}printf("\n");}M[1][1] = 1;Maze(1, 1);return 0;}





原创粉丝点击