迷宫问题——回溯法解
来源:互联网 发布:top域名能备案吗 编辑:程序博客网 时间:2024/05/21 07:04
题目描述
迷宫是一个二维矩阵,其中1为墙,0为路,入口在第一列,出口在最后一列。
要求从入口开始,从出口结束,按照 上,下,左,右 的顺序来搜索路径.
输入
第一行输入迷宫大小N
第二行输入入口坐标
接下来n行输入完整迷宫
输出
输出完整棋盘,所有解法,走过的路用6表示。
样例输入
8 0 7 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1
样例输出
1 1 1 1 1 1 1 1 1 0 1 1 6 6 6 6 1 0 1 6 6 1 0 1 1 1 6 6 1 0 1 1 1 6 6 1 0 0 0 1 1 6 0 0 0 1 1 1 1 6 1 0 0 1 0 1 6 6 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1
实现代码
#include <stdio.h>#define N 19 //整个迷宫大小(包括最外层墙壁)char Maze[N][N] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1}, {1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1}, {1,1,1,0,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1}, {1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,1}, {1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1}, {1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1}, {1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1}, {1,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1}, {1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,1}, {1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1}, {1,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1}, {1,0,1,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1}, {1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1}, {1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1}, {0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};char step[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //定义四个方向int count = 0;char Check(char i, char j) //判断下一步是不是通路{ if(i >= 0 && i<=18 && j >= 0 && j <= 18) { if(0 == Maze[i][j]) { return 1; } } return 0;}void Display(void){ char i, j; for(i=0; i<N; ++i) { for(j=0; j<N; ++j) { printf("%d", Maze[i][j]); } printf("\n"); }}void Find(char ci, char cj){ char n; if((N-1) == cj) //这个边界设置得比较粗糙,到N-1这个下标就算终点,没想到什么好的办法 { Maze[ci][cj] = 6; //终点的最后一个6 printf("解法%d(Enter回车查看下一解法):\n", ++count); Display(); getchar(); Maze[ci][cj] = 0; } else { for(n=0; n<4; ++n) { if(Check(ci+step[n][0], cj+step[n][1])) //依然用Check实现判断:是否可以在某个方向走下一步 { Maze[ci][cj] = 6; //6表示走过的路 Find(ci+step[n][0], cj+step[n][1]); Maze[ci][cj] = 0; //传统回溯方法 } } }}int main(void){ printf("\t迷宫问题(1 墙壁 0 道路 6 解法)\n\n"); printf("原迷宫(Enter回车查看解法):\n"); Display(); getchar(); //(17, 0)为起点 Find(17, 0); return 0;}
7 0
- 迷宫问题——回溯法解
- 回溯法——迷宫问题
- 回溯法——迷宫问题
- 回溯法解迷宫问题
- 回溯法解迷宫问题
- 迷宫问题 回溯法
- 回溯法-迷宫问题
- 回溯法求迷宫问题
- 回溯法求迷宫问题
- 回溯法解决迷宫问题
- 回溯法求迷宫问题
- 回溯法解决迷宫问题
- 回溯法解决迷宫问题
- 回溯法求解迷宫问题
- 回溯法解迷宫问题的两个解法
- POJ——3984迷宫问题(BFS+回溯)
- 回溯算法经典应用之—迷宫问题 (Java)
- 剑指Offer——回溯算法解迷宫问题(java版)
- 如何把ppt幻灯片转成pdf文档
- 【java】java各种删除指定文件夹或文件方法详解
- lodash摘要
- HDU 2614 Beat(dfs)
- SylixOS Shell使用
- 迷宫问题——回溯法解
- 回调函数和函数指针
- [软件工程]提前完成任务的风险如何定义
- 【java】for循环语句的3种遍历方法
- "svn检出"has encountered a problem cannot checkout
- 干货分享!不得不看的【7年竞价实战经验总结】
- 【wed】wed网页随机产生验证码图片(版本tomcat-8.0.14)
- Mybatis使用及原理解析
- NSURLConnection和UITableView的delegate执行先后问题的解决方法