zoukankan      html  css  js  c++  java
  • 迷宫问题-回溯

     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 }
  • 相关阅读:
    爬虫入门
    读写文件操作
    列表的操作
    课后习题小练
    Python切片
    逗号的麻烦
    字符串学与练
    Turtle的学习
    FTL(FreeMarker)基础
    java反射机制基础
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/12831449.html
Copyright © 2011-2022 走看看