zoukankan      html  css  js  c++  java
  • 【计蒜客】 走迷宫

    总而言之,关于迷宫好像大部分都是搜索题....

    先看一下题:(数据范围好小啊

     

    给一个nm列的2维的迷宫,'S'表示迷宫的起点,'T'表示迷宫的终点,'#'表示不能通过的点,'.' 表示可以通过的点。你需要从'S'出发走到'T',每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。

    输入格式

    第一行输入 n, m (1≤n,m≤10)表示迷宫的大小

    接下来输入n行字符串表示迷宫。

    输出格式

    输入通过迷宫的方法数。

    样例输入1

    2 3
    S.#
    ..T

    样例输出1

    2

    样例输入2

    3 3
    S..
    .#.
    ..T

    样例输出2

    2

    思路:

    这道题其实就是一道深搜的模板,找到起点,分四个方向进行搜索,然后进行判定,
    判定是否越界或已被vis
    数组标记或根本不能走。直到找到终点为止,方案数加一,并返回。


    大体过程:


    存char类型的图 -----> 进行dfs,寻找终点(注意特判),方案数累加 ------> 输出方案数




    下面是AC代码:
     1 #include<cstdio>
     2 #include<iostream>
     3 
     4 using namespace std;
     5 
     6 
     7 const int maxn = 25;
     8 
     9 char g[maxn][maxn];
    10 bool vis[maxn][maxn];
    11 int cnt;//方案数 
    12 int qx, qy;//起点横纵坐标 
    13 int m, n;
    14 
    15 void dfs(int x, int y){
    16     if(g[x][y] == 'T'){
    17         cnt++;//找到终点,方案数+1 
    18         return;
    19     }
    20     int u, o;
    21     for(int i = 1; i <= 4; i++){
    22         //进行四个方向的搜索 
    23         if(i == 1) u = x, o = y - 1;
    24         else if(i == 2) u = x, o = y + 1;
    25         else if(i == 3) u = x + 1, o = y;
    26         else u = x - 1, o = y;
    27         if(u < 1 || o < 1 || o > m || u > n) continue;//越界 
    28         if(g[u][o] == '#') continue;//障碍 
    29         if(vis[u][o]) continue;//已被访问 
    30         vis[u][o] = 1;
    31         dfs(u, o);//再次进行 
    32         vis[u][o] = 0;
    33     }
    34 }
    35         
    36 
    37 
    38 int main(){
    39     scanf("%d%d", &n, &m);
    40     for(int i = 1; i <= n; i++){
    41         for(int j = 1; j <= m; j++){
    42             cin>>g[i][j];
    43             if(g[i][j] == 'S')  qx = i, qy = j;
    44         }
    45     }
    46     vis[qx][qy] = 1;
    47     dfs(qx, qy);//从起点开始 
    48     printf("%d
    ", cnt);
    49     return 0;
    50 }


  • 相关阅读:
    【LeetCode】650. 只有两个键的键盘
    【LeetCode】70. 爬楼梯
    【LeetCode】746. 使用最小花费爬楼梯
    【LeetCode】198. 打家劫舍
    【LeetCode】53.最大子序和
    【LeetCode】1056-易混淆数
    【人工智能系列】python的Quepy库的学习
    【计划书】关于运营商的人工智能的想法
    【转】经典!python中使用xlrd、xlwt操作excel表格详解
    转]python 结巴分词(jieba)学习
  • 原文地址:https://www.cnblogs.com/New-ljx/p/10574938.html
Copyright © 2011-2022 走看看