zoukankan      html  css  js  c++  java
  • 洛谷P1605 迷宫【DFS】

    题目背景

    迷宫 【问题描述】

    给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和

    终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫

    中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

    输入样例 输出样例

    【数据规模】

    1≤N,M≤5

    题目描述

    输入输出格式

    输入格式:

    【输入】

    第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点

    坐标FX,FY。接下来T行,每行为障碍点的坐标。

    输出格式:

    【输出】

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

    案总数。

    输入输出样例

    输入样例#1: 复制

    2 2 1
    1 1 2 2
    1 2
    

    输出样例#1: 复制

    1

    思路:直接运用深搜,不过注意要记得回溯。

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int N,M,sx,sy,fx,fy;
    int s[6][6],ans=0;  //地图和计数器
    void dfs(int r,int c)
    {
        if(r==fx && c==fy)   //如果到终点,本次搜索结束
            {
                ans++;
                return;
            }
        if(r>0 && r<=N && c>0 && c<=M && s[r][c])
        {
            s[r][c]=0;      //标记已经走过
            dfs(r+1,c);
            dfs(r-1,c);
            dfs(r,c+1);
            dfs(r,c-1);
            s[r][c]=1;      // 回溯
        }
    }
    int main()
    {
        int t,x,y;
        scanf("%d%d%d",&N,&M,&t);
        scanf("%d%d%d%d",&sx,&sy,&fx,&fy);
        memset(s,1,sizeof(s));
        for(int i=0;i<t;++i)
        {
            scanf("%d%d",&x,&y);
            s[x][y]=0;
        }
        if(s[fx][fy]==0)    //如果终点是障碍的话直接结束
        {
            printf("0
    ");
            return 0;
        }
        dfs(sx,sy);
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    【2021-05-18】人生十三信条
    【2021-05-17】打了第一针疫苗
    【2021-05-16】该工作时好好工作,该休息时好好休息
    【2021-05-15】人生十三信条
    【2021-05-14】要保持团队作战的模式
    【2021-05-13】罗马不是一天能建成的
    【2021-05-12】己所不欲勿施于人
    【2021-05-11】服务好了别人,也就服务好了自己
    二维区域和检索
    寻找重复数
  • 原文地址:https://www.cnblogs.com/aerer/p/9930971.html
Copyright © 2011-2022 走看看