zoukankan      html  css  js  c++  java
  • codeforces ice cave

      1 ///
      2 ///    题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎
      3 ///    DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了;2. 若两点相邻,       
      4 ///    那么要不就是踩一脚就破了或者踩一脚走开再走回来踩一脚破了;3. 普通的搜索看是否能到达,
      5 ///         若能还是要讨论终点踩几脚的问题:)
      6 ///    DFS 耗时大,险些超时,可以用BFS来做
      7 ///
      8 ///    自己写了一个能AC的,感觉太长比较挫,看到网上有比较短的,注释了下觉得应该自己以后应该写成这样
      9 #include <cstdio>
     10 #include <algorithm>
     11 #include <cstring>
     12 #include <queue>
     13 #include <string>
     14 #include <iostream>
     15 using namespace std;
     16 const int MAXN = 5e2 + 10;
     17 const int INF = 0x3f3f3f3f;
     18 int n, m;
     19 int sx, sy, ex, ey;
     20 char maze[MAXN][MAXN];
     21 bool vis[MAXN][MAXN];
     22 int dx[4] = {1, -1, 0, 0};
     23 int dy[4] = {0, 0, -1, 1};
     24 
     25 bool BFS(void)
     26 {
     27     queue<pair<int, int> > Q;///2个变量时使用pair,不写结构体,bfs能缩短几行代码
     28     Q.push (make_pair (sx, sy));
     29     while (!Q.empty ())
     30     {
     31         int x = Q.front ().first;
     32         int y = Q.front ().second;
     33         Q.pop ();
     34         for (int i=0; i<4; ++i)
     35         {
     36             int tx = x + dx[i];
     37             int ty = y + dy[i];
     38 
     39             if (tx == ex && ty == ey)    return true;
     40 
     41             if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.')
     42             {
     43                 maze[tx][ty] = 'X';
     44                 Q.push (make_pair (tx, ty));
     45             }
     46         }
     47     }
     48 
     49     return false;
     50 }
     51 
     52 int main(void)
     53 {
     54     while (scanf ("%d%d", &n, &m) == 2)
     55     {
     56         memset (vis, 0, sizeof (vis));
     57         for (int i=1; i<=n; ++i)
     58         {
     59             scanf ("%s", maze[i]+1);
     60         }
     61         scanf ("%d%d", &sx, &sy);
     62         scanf ("%d%d", &ex, &ey);
     63 
     64         int cnt = 0;
     65         bool flag = false;
     66         ///终点四周'.'的个数
     67         for (int i=0; i<4; ++i)///未BFS前就处理出来,免得bfs后处理同样要多几行代码且麻烦,而且这里是处理了所有的情况
     68         {
     69             int tx = ex + dx[i];
     70             int ty = ey + dy[i];
     71             if (tx == sx && ty == sy)    flag = true;
     72             if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.')    cnt++;
     73         }
     74 
     75         if (sx == ex && sy == ey)///为'X’,四周需要至少一个'.'来做铺垫(走到‘.’,再走回来)
     76         {
     77             if (cnt >= 1)    puts ("YES");
     78             else puts ("NO");
     79         }
     80         else if (flag)///起点和终点相邻,分终点是‘X’ 还是‘.’的情况
     81         {
     82             if (maze[ex][ey] == 'X')    puts ("YES");
     83             else
     84             {
     85                 if (cnt >= 1)    puts ("YES");///是‘.’的话 同样需要周围至少有一个'.'来做铺垫
     86                 else    puts ("NO");
     87             }
     88         }
     89         else
     90         {
     91            ///起点和终点不相邻的情况,BFS是否连通
     92             if (BFS () == true)
     93             {
     94                 if (maze[ex][ey] == 'X')    puts ("YES");
     95                 else if (cnt >= 2)    puts ("YES");///终点和起点不相邻时,终点周围至少要有2个.才能满足要求
     96                 else    puts ("NO");
     97             }
     98             else    puts ("NO");
     99         }
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    SVN的安装和使用手册
    高德坐标/百度地图获取经纬度
    MVC中返回json数据的两种方式
    [译]Flutter JSON和序列化
    ios 网络字节顺序的转换HTOS
    [swift]可选类型
    向OC类中添加默认的协议实现(ProtocolKit)
    [swift] NSClassFromString 无法获得该类
    Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic
    iOS 9适配技巧
  • 原文地址:https://www.cnblogs.com/jiachinzhao/p/4546038.html
Copyright © 2011-2022 走看看