迷宫问题-回溯

Posted zhmlzhml

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫问题-回溯相关的知识,希望对你有一定的参考价值。

 1 //
 2 // Created by Arc on 2020/5/5.
 3 // 
 4 //
 5 /*
 6  * 题意大概就是,一个m*n的迷宫,0表示可通行,1表示不可通行,求一下有几种求法并写出路径
 7  * 很明显的回溯
 8  * 但这个题注意一个问题,就是走过一遍的地方要给标注上
 9  *
10  * 其实拓展一下,如果不需要求出路径只判断能不能通过的话,就是一个联通块问题,
11  * dfs一定要记住把走过的路标记一下
12  *
13  * 这个题一个很好的地方就在于它存坐标:
14  * 在图表中存坐标用二维数组,第一维是第几步,第二维是x对应1,y对应2
15  *
16  * 在这个二维数组存数的时候不需要在后面多此一举赋值回来,因为早晚都是覆盖
17  * 但是!在判断是否走过的时候要赋值回来!
18  *
19  *
20  * 说一个自己很han的地方,一开始没有加上有没有通路的判断,然而第一个样例就是没有通路orz
21  * 于是本小白就开始伟大的单步!
22  * 当然并没有看出什么问题orz
23  */
24 #include<bits/stdc++.h>
25 using  namespace std;
26 int a[100][2];
27 
28 int n,m;
29 int fx[4]={0,0,1,-1};
30 int fy[4]={1,-1,0,0};//这里是四种路线
31 int search(int i);
32 void print( int step);
33 bool c[100][100];//判断是否走过
34 int num=0;
35 /*
36  * c和num一定要弄成全局
37  */
38 int main(){
39 
40 
41     cin>>n>>m;
42     for (int i = 0; i < n ; ++i) {
43         for (int j = 0; j < m ; ++j) {
44             cin>>c[i][j];
45 
46         }
47 
48     }
49     a[1][1]=0;//从(0,0)开始,所以第一步给i赋值
50     a[1][2]=0;
51     search(2);
52     if(num!=0) {
53         cout << "共有" << num << ""<<endl;
54     }
55     else
56         cout<<"没有通路啊!"<<endl;
57 
58 }
59 int search(int step){
60     for(int i=0;i<4;i++){
61         if(a[step-1][1]+fx[i]>=0 && a[step-1][1]+fx[i]< m && a[step-1][2]+fy[i]>=0 && a[step-1][2]+fy[i]<n && !c[a[step-1][1]+fx[i]][a[step-1][2]+fy[i]])
62         //判断是否越界:上一步的加本次的是否越界,每一次的条件都是要卡死的
63             //最后要判断一下这个点可不可以走
64         {
65             a[step][1]=a[step-1][1]+fx[i];
66             a[step][2]=a[step-1][2]+fy[i];//因赋值所以不用在最后"回溯"赋值咯
67             c[a[step-1][1]+fx[i]][a[step-1][2]+fy[i]]=1;
68             if(a[step][1]==m-1 && a[step][2]==n-1 )
69                 print(step);
70             else
71                 search(step+1);
72             c[a[step-1][1]+fx[i]][a[step-1][2]+fy[i]]=0;//回溯是否可走
73 
74         }
75     }
76     return 0;
77 }
78 void print( int step){
79     num++;
80     cout<<num<<":"<<endl;
81     for (int i = 1; i <= step ; ++i) {
82         cout<<"("<<a[i][1]<<","<<a[i][2]<<")"<<endl;
83 
84     }
85 
86 
87 }

 

以上是关于迷宫问题-回溯的主要内容,如果未能解决你的问题,请参考以下文章

回溯算法走迷宫(Java版)

迷宫回溯和八皇后问题

回溯算法之迷宫问题

兔年之兔子走迷宫 用一个小游戏对回溯法进行实现 | C++

解决迷宫回溯

迷宫问题(MazePath)的求解——利用回溯法(backtracking)