zoukankan      html  css  js  c++  java
  • NOI 题库 2753

    2753  走迷宫

    描述
    一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
    给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
    输入
    第一行是两个整数,R和C,代表迷宫的长和宽。( 1<= R,C <= 40)
    接下来是R行,每行C个字符,代表整个迷宫。
    空地格子用'.'表示,有障碍物的格子用'#'表示。
    迷宫左上角和右下角都是'.'。
    输出
    输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
    样例输入
    5 5
    ..###
    #....
    #.#.#
    #.#.#
    #.#..
    
    样例输出
    9

     1 #include "bits/stdc++.h"
     2 
     3 using namespace std;
     4 const int maxN = 110 ; 
     5 const int INF = 2147483647 ;
     6 const int dx [ ] = { 1 , -1 , 0 , 0 } ;
     7 const int dy [ ] = { 0 , 0 , -1 , 1 } ;
     8 typedef long long QAQ ;
     9 
    10 int r , c , ans = INF ;
    11 
    12 char mp[ maxN ][ maxN ] ;
    13 bool vis[ maxN ][ maxN ] ;
    14 
    15 void DFS ( const int xi , const int yi , const int step ) {
    16         if ( mp[ xi ][ yi ] == '#' || step > ans ) return ;//当当前答案比已有答案差,不再继续搜索 
    17         if( xi == r && yi == c ) {
    18                 ans = min ( ans , step ) ;
    19                 return ;
    20         }
    21         for(int i = 0; i < 4; ++i ) {
    22                 int xx = xi + dx [ i ] ;
    23                 int yy = yi + dy [ i ] ;
    24                 if ( !vis[ xx ][ yy ] && mp[ xx ][ yy ] == '.' ) {
    25 
    26                         vis[ xx ][ yy ] = true ;
    27                         DFS( xx , yy , step + 1 ) ;
    28                         vis[ xx ][ yy ] = false ;
    29                 }
    30         }
    31 }
    32 
    33 void Init ( ){
    34         for ( int i=0 ; i<=r+1 ; ++i )
    35                 for ( int j=0 ; j<=c+1 ; ++j )
    36                         if ( i==0 || i == r+1 || j==0 || j== c+1 ) mp[ i ][ j ] = '#' ;
    37 }
    38 
    39 int main ( ) {
    40         scanf ( "%d%d" , &r , &c ) ;
    41         Init ( );
    42         getchar ( ) ;
    43         for ( int i=1 ; i<=r ; ++i ){
    44                 for ( int j=1 ; j<=c ; ++j ) {
    45                         mp[ i ][ j ] = getchar ( ) ; 
    46                 }
    47                 getchar ( ) ;
    48         }
    49         
    50         vis[ 1 ][ 1 ] = true;
    51         DFS ( 1 , 1 , 1 ) ;
    52         cout << ans << endl ;
    53         return 0;
    54 }
    View Code

    2016-10-18 18:20:22

    (完)

  • 相关阅读:
    Linq 实例
    VS的无用文件
    我在vs文本编辑中常用的快捷键----常更新
    EF+MVC学习中的不理解的问题
    Lambda表达式
    Linq学习(主要参考linq之路)----2LINQ方法语法
    WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”
    SQL
    SQL Server
    sql 判断表是否存在
  • 原文地址:https://www.cnblogs.com/shadowland/p/5974398.html
Copyright © 2011-2022 走看看