zoukankan      html  css  js  c++  java
  • POJ 3009

    题意:已知起点和终点,求石子从起点到达终点的最短路,如果无法到达,则输出-1。石子移动的具体规则如下:
       1、开始时,石子在起点s处
       2、运动方向可以是水平或垂直的,不能斜方向运动
       3、最开始的时候,你可以将石子向上下左右任意一个方向抛,如果与它相邻的点是障碍物的话除外
       4、一旦石子开始运动,有三种可能:
          a、遇到障碍物,石子会停在障碍物的前一格,障碍物会消失
          b、如果出界,游戏失败
          c、到达终点,游戏结束并成功
       5、如果移动的次数超过10次,将认为游戏是失败的

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cctype>
     5 #include <cmath>
     6 #include <time.h>
     7 #include <string>
     8 #include <map>
     9 #include <stack>
    10 #include <set>
    11 #include <queue>
    12 #include <vector>
    13 #include <algorithm>
    14 #include <iostream>
    15 using namespace std;
    16 typedef long long ll;
    17 typedef pair<int,int> P;
    18 #define PI acos( -1.0 )
    19 const double E = 1e-8;
    20 const int INF = 0x7fffff;
    21 const int NO = 105;
    22 int a[NO][NO];
    23 int n, m, ans;
    24 int bi, bj;
    25 int dir[][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} };
    26 
    27 bool judge( int x, int y )
    28 {
    29     if( x >= 0 && y >= 0 && x < n && y < m )
    30         return true;
    31     return false;
    32 }
    33 
    34 void dfs( int x, int y, int num )
    35 {
    36     if( num >= 10 || num > ans )
    37         return;
    38     for( int i = 0; i < 4; ++i )
    39     {
    40         int dx = x + dir[i][0];
    41         int dy = y + dir[i][1];
    42         if( judge( dx, dy ) && a[dx][dy] == 3 )
    43         {
    44             if( ans > num+1 && num < 10 )
    45                 ans = num + 1;
    46             return;
    47         }
    48         if( judge( dx, dy ) && a[dx][dy] == 0 )
    49         {
    50             bool flag = true;
    51             while( a[dx][dy] == 0 )
    52             {
    53                 dx += dir[i][0];
    54                 dy += dir[i][1];
    55                 if( !judge( dx, dy ) ) {
    56                     flag = false;
    57                     break;
    58                 }
    59                 if( a[dx][dy] == 3 )
    60                 {
    61                     if( ans > num+1 && num <= 9 )
    62                         ans = num + 1;
    63                     return;
    64                 }
    65             }
    66             if( flag )
    67             {
    68                 a[dx][dy] = 0;
    69                 dfs( dx-dir[i][0], dy-dir[i][1], num+1 );
    70                 a[dx][dy] = 1;
    71             }
    72         }
    73     }
    74 }
    75 
    76 int main()
    77 {
    78     while( ~scanf( "%d%d", &m, &n ) && n+m )
    79     {
    80         for( int i = 0; i < n; ++i )
    81             for( int j = 0; j < m; ++j )
    82             {
    83                 scanf( "%d", &a[i][j] );
    84                 if( a[i][j] == 2 )
    85                 {
    86                     a[i][j] = 0;
    87                     bi = i;
    88                     bj = j;
    89                 }
    90             }
    91         ans = INF;
    92         dfs( bi, bj, 0 );
    93         if( ans != INF )
    94             printf( "%d
    ", ans );
    95         else
    96             puts( "-1" );
    97     }
    98     return 0;
    99 }
    View Code
  • 相关阅读:
    汉字词组换行
    C#中获取Excel文件的第一个表名
    SQL查找某一条记录的方法
    C#数据库连接字符大全
    整理的asp.net资料!(不得不收藏)
    母版页的优点,及母版页与内容页中相互访问方法
    13范式
    使用 Jackson 树连接线形状
    word2007,取消显示回车符
    三张表之间相互的多对多关系
  • 原文地址:https://www.cnblogs.com/ADAN1024225605/p/4092190.html
Copyright © 2011-2022 走看看