迷宫 c 所有路径深度 搜索递归一条路径(Maze C all path depth search recursive a path).doc
迷宫 c 所有路径 深度 搜索 递归 一条路径(Maze C all path depth search recursive a path)/ / */ / *2011 > >武陟> >迷宫1。在迷宫中只找一条路径的,深度搜索,找到则返回,利用栈法2。找所有路径,也是深度搜索,递归法;若路径过多则显得很慢三.广度搜素,找迷宫最短路径。用队列广度。4。*算法有待补充/ / =/ / =首先对于一条路径的迷宫的探索。深度搜索原理,从原点开始,先往下走,再往右走,遇到四个方向无法走的就回退一步,知道走到出口。迷宫地图如下:/ *1,1,1,1,1,1,1,1,1,1,1,11,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,11,0,8,0,0,0,8,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,8,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,11,0,0,8,8,0,0,0,0,0,0,11,0,0,0,8,0,0,0,0,0,0,11,1,1,1,1,1,1,1,1,1,1,1* /首先,迷宫地图的处理:为了美观我们不设- 1等两位数的标记位。0是通路,显示为:”;1是墙壁,显示为:“”;3往下走,显示为:“”;4往右走,显示为:“”;5往左走,显示为:“”;6往上走,显示为:“”;2是标记走过的路径:只是标记7标记开始位置9标记结束位置8障碍的标记程序设置:起点-1,1,出口 10, 10 。/ *找到一条路线:* /伪代码:栈+ 1,把起点放入栈而(没有达到栈底时)取出栈顶如果(判断是终点)返回找到通路;对于(四个方向)如果(下面方向可以走)入栈,打破;如果(右面方向可以走)入栈,打破;如果(左面方向可以走)入栈,打破;如果(上面方向可以走)入栈,打破;如果(四个方向没有走)把栈顶位置标记障碍,弹栈返回没有通路/ / =/ / =代码实现=#包括< stdio. h >#包括<< malloc。”#包括<字符串。”#定义最大值12#定义maxh 12#定义最大10000无效showbg(int *);int DFS(int 3 ,int 12 ;int判断(int x,int y,int 12);国际竞争(x,y);无效的方向(int 3 ,int b 最大值);无效main()b maxh 最大值,我,J;int 3 ,t0,h0;memset(a,0,sizeof(a);memset(B,0,sizeof(b);为(i = 0;i < maxh;i+)为(J = 0;J < maxl;j+)scanf(“%d”,与B 我 J );如果(DFS(a,b)printf(“找到一条通路为:n n”);方向(A,B);其他的printf(“没有通路n n”);b 1 17;b 10 109;ShowBg(int *)b);返回;无效showbg(int *)int,j;为(i = 0;i < maxh;i+)为(J = 0;J < maxl;j+)如果(*(+ maxl *我+ j)= = 1)printf(“”);如果(*(+ maxl *我+ j)= = 3)printf(“”);如果(*(+ maxl *我+ j)= = 4)printf(“”);int a maxl 3, int & tatol)int k, tx, ty, p;int b 4, 2 = 1,0, - 1,0, 0, 1, 0, 1;/ / , 4, 5, 6, 7, 下上左右int c 4 = 4,5,6,7;for (k = 0; k < 4; k + +) / / 四个方向if (check (i, j, k, a) = = 1) tx = in + b k 0;ty = j + b k 1;a i j 1 = c k;p = a tx for 0; / / 记录当前的节点状态a tx for 0 = 3; / / 表示节点已经走过if (tx = = maxh - 2 & & ty = = maxl - 2) tatol + +;printmaze (a, tatol);elsesearch (tx, ty, a, tatol);a tx for 0 = p; / / 返回之前记录的状态 / / fora i j 0 = 2; / 所有情况都不行, 则表示死胡同int check (int i, int y, int k, int a maxl 3) int b 4, 2 = 1,0, - 1,0, 0, 1, 0, 1;in + b = k 0;j + b = k 1;if (in the < = 0 | | in > = maxh - 1 | | j < = 0 | | j > = maxl - 1)return 0;elseif (a i j 0. = 0) return 0;return 1;void printmaze (int a maxl 3, int & tatol) int i, j;(a) 1 1 0 = 5;(a) 10, 10, 0 = 6;printf ( n - 第% 3d 种走法 - n n ", tatol);for (i = 0; i < maxh; i + +)for (j = 0, j < maxl; j + +) / / printf ("% d", (a i j 0);if (a i j 0 = = 1) printf (""); else if (a i j 0 = = 8) printf ("-"); else if (a i j 0 = = 5) printf (-); else if (a i j 0 = = 6) printf (""); else if (a i j 0 = = 3)if (a i j 1 = = 4) printf ("change"); else if (a i j 1 = = 5) printf ("with"); else if (a i j 1 = = 6) printf (""); else if (a i j 1 = = 7) printf ("agreement"); else printf ("");elseprintf (""); / / forprintf ( n);/ *1 1 1 1 1 1 1 1 1 1 1 11 0 0 8 0 0 0 0 0 0 0 11 0 8 8 8 0 0 0 8 0 1 1 0 1 01 0 0 8 8 8 8 8 8 8 0 11 0 0 8 0 0 0 0 0 8 0 11 0 0 8 0 8 8 8 8 0 1 1 0 1 01 0 0 0 0 0 0 0 8 0 8 8 0 8 0 11 8 0 8 8 0 0 0 0 0 0 11 0 0 8 0 8 8 0 8 8 0 11 0 0 8 8 0 8 0 0 0 0 11 0 0 0 0 0 0 0 8 0 0 8 8 0 1 1 0 1 01 1 1 1 1 1 1 1 1 1 1 1输出:- 第 1 种走法 - - - - - - - - - 第 2 种走法 - - - - - - - - - - 第 3 种走法 - - - - - - - - - - - - "A" a "a" a "a" aFourth ways of walking -"A" a "a" a "a" aThe - -.The decrease in anthraquinone anthraquinone.The key - anthraquinone anthraquinone anthraquinone.The down - down - flashball flashball.The key to the up - down - - - -.* flashball = nitrile - down -.The nitrile - flashball case.The nitrile nitrile - down.The nitrile - down -.The nitrile -, * *"A" a "a" a "a" a* /=/= breadth maze blocked queue