经典递归回溯问题
- 问题一:给定一个迷宫,指定其起点和终点,要遍历出所有能够从起点到终点的路径,并打印每一种情况出来?
- 问题二:常玩的连连看如何进行判断的呢,若改变其规则,算法能否在最小的改动下成功适应新的规则呢?
问题一
-
思路
- 首先我们定义迷宫的大小M、N,并加上外墙构成一个数组maze[M+2][N+2]。
- 定义我们的方向数组direc[4],这里假设只有4个方向(上下左右),也可以尝试定义成8个方向
- 给出迷宫的起点和终点:start、end
- 递归回溯遍历:
- 我们每到一个点,就有四个方向可以选择
- 每个方向的下一个点我们都需要判断其是否为通路
- 若为通路,标记当前点,再判断其是否为终点:若是,则打印该条路径,返回后,清除之前的标记;若不是,则继续第一步
- 若不是通路,则换个方向继续判别
-
代码
#include<iostream> using namespace std; const int M=5; const int N=7; //postion struct PosType{ int x; int y; }; //maze,其中1表示墙体 int maze[M+2][N+2]={ // 0 1 2 3 4 5 6 7 8 /*0*/ 1,1,1,1,1,1,1,1,1, /*1*/ 1,0,1,1,1,0,1,0,1, /*2*/ 1,0,0,1,1,1,0,0,1, /*3*/ 1,1,0,0,0,1,1,0,1, /*4*/ 1,1,1,0,1,1,0,0,1, /*5*/ 1,0,0,0,0,0,0,1,1, /*6*/ 1,1,1,1,1,1,1,1,1 }; //direction,一共可以有4个方向可以走 const