zoukankan      html  css  js  c++  java
  • 洛谷P1605 迷宫 深度搜索 模板!

    题目背景

    给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

    题目描述

    输入格式

    第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。

    输出格式

    给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。

    输入输出样例

    输入 #1
    2 2 1
    1 1 2 2
    1 2
    
    输出 #1
    1

    说明/提示

    【数据规模】

    1≤N,M≤5

    代码

    #include <iostream>
    #include <cstdio>
    using namespace std;
    bool G[15][15],VIS[15][15];    //G为总地图,VIS记录是否访问
    int n,m,d[5]= {-1,0,1,0,-1};       //方向
    int nx,ny,ex,ey,CNT;
                //nx,ny起点坐标;ex,ey终点坐标,CNT路径条数
    void dfs(int x,int y) {
     if (x ==ex&&y ==ey) {       //如果到终点
      CNT++;          //路径加一
      return;        //回去继续查找 返回上一级
     }
     for (int k=0; k<4; k++) {
      int l=x+d[k];
      int r=y+d[k+1];
      if (l>=1&&r>=1&&l<=n&&r<=m&&!G [l][r]&&!VIS [l][r]) {      //注意起点
       VIS [l][r]=true;              //标记为已访问
       dfs (l,r);
       VIS [l][r]=false;            //回溯
      }
     }
     return;                        //返回上一级 继续查找  如果上一级还是没有合适路径,继续返回           
    }
    int main () {
     int t,zx,zy;
     cin>>n>>m>>t>>nx>>ny>>ex>>ey;
     G[nx][ny]=true;
     while(t--) {
      cin>>zx>>zy;
      G[zx][zy]=true;            //设为障碍
     }
     dfs (nx,ny);          //从起点开始寻找
     cout<<CNT;
     return 0;
    }
     
    深度搜索套用模板
     
    补充:C语言里面是没有bool(布尔)类型的,C++里面才有,这就是说,在C++里面使用bool类型是没有问题的。bool类型有只有两个值:true =1 、false=0
  • 相关阅读:
    【CF732D】Exams(线性扫描,贪心,二分)
    【CF652C】Foe Pairs(线性扫描)
    【CF645D】 Robot Rapping Results Report(拓扑排序,二分)
    【BZOJ入门3189】 猜数字(数学,搜索)
    【CF559C】 Gerald and Giant Chess(计数,方案数DP,数论)
    【NOIP2016练习&BZOJ2125】T3 sp (树上倍增,最短路)
    【NOIP2016练习】T2 forest (树形DP,数论)
    【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)
    【CF713C】Sonya and Problem Wihtout a Legend(离散化,DP)
    js函数知识点
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11618499.html
Copyright © 2011-2022 走看看