海王星0908 海王星0908
拆迁队总指挥!
关注数: 12 粉丝数: 324 发帖数: 15,774 关注贴吧数: 26
跪求!!!如何改进这个迷宫算法??比如,递归改为非递归 #include <stdio.h> #include <stdlib.h> int success=0; char a; //定义全局变量(任何函数都可以利用他的值和改变他的值) int visit(int,int); //定义全局函数 int maze[20][21] = { {0,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, {0,2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2}, {0,2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2}, {0,2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2}, {0,2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2}, {0,2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2}, {0,2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 2}, {0,2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2}, {0,2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2}, {0,2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2}, {0,2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2}, {0,2, 2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 2}, {0,2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 2}, {0,2, 0, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2}, {0,2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2}, {0,2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 2}, {0,2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 2}, {0,2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2}, {0,2, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2}, {0,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, }; int startI = 1, startJ = 2; // 入口 int endI = 18, endJ = 19; // 出口 int main(void) //主函数开始执行 { int i, j; printf("****************显示迷宫****************\n\n"); for(i = 0; i < 20; i++) //显示出迷宫(需要连续打印), 控制打印地i+1行迷宫 的语句 { for(j = 0; j < 21; j++) //控制打印(第i+1行,第j+i列)迷宫 的语句 if(i==1&&j==1) printf("→"); //第二行的第一格为进入迷宫的箭头(告诉别人从哪里进入) else if(i==18&&j==20) printf("→"); //第十一行的最后一格为走出迷宫的箭头(告诉别人从哪里出去) else if(i==0&&j==1) printf("进"); else if(i==19&&j==20) printf("出"); else if(maze[i][j]== 2) //(数值为2时)打印出墙壁 printf("█"); else printf(" "); //(数值不为2并且不占用箭头格的)打印出空间 printf("\n"); } printf("\n"); if(visit(startI,startJ) == 0) //如果入口没有路通出口,那么就说“没找到出口!” printf("\n没有找到出口!\n"); else //如果有路通出口,就打印出可通出口的一条路径 { printf("输入'y'显示路径,输入其他退出: "); a=getchar(); if(a=='y'||a=='Y') { printf("\n\n******************显示路径****************\n\n"); for(i = 0; i < 20; i++) //在整个迷宫找通路 { for(j = 0; j < 21; j++) { if(i==1&&j==1) printf("→"); else if(i==18&&j==20) printf("→"); else if(maze[i][j]== 2) printf("█");//打印初始化的墙壁 else if(maze[i][j]==1) printf("▽"); //打印出能通到出口的脚印 else printf(" "); } printf("\n"); } } else return 0; } getchar(); //控制“老鼠出迷宫.EXE”可执行程序不是一执行就马上退出 getchar(); return 0; //主函数为int型,需要有返回值 } int visit(int i, int j) //此处 i,j相当于坐标,即迷宫二维数组的两个下标 { maze[i][j] = 1; if(i == endI&&j == endJ) //控制下面的五条语句的执行, success = 1; if(success != 1 && maze[i][j+1] == 0) visit(i,j+1);//递归调用,如果能够通到最后一格,这开始回溯 打印脚迹 if(success != 1 && maze[i+1][j]== 0) visit(i+1,j); if(success != 1 && maze[i][j-1]== 0) visit(i,j - 1); if(success != 1 && maze[i-1][j]== 0) visit(i-1,j); if(success != 1) maze[i][j] = 0; return success; }
首页 1 2 3 4 下一页