• DFS/BFS Codeforces Round #301 (Div. 2) C. Ice Cave


    题目传送门

     1 /*
     2     题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎
     3     DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了;2. 若两点相邻,
     4         那么要不就是踩一脚就破了或者踩一脚走开再走回来踩一脚破了;3. 普通的搜索看是否能到达,
     5         若能还是要讨论终点踩几脚的问题:)
     6     DFS 耗时大,险些超时,可以用BFS来做
     7 */
     8 #include <cstdio>
     9 #include <algorithm>
    10 #include <cstring>
    11 #include <string>
    12 #include <iostream>
    13 using namespace std;
    14 
    15 const int MAXN = 5e2 + 10;
    16 const int INF = 0x3f3f3f3f;
    17 int n, m;
    18 int sx, sy, ex, ey;
    19 char maze[MAXN][MAXN];
    20 bool vis[MAXN][MAXN];
    21 int dx[4] = {1, -1, 0, 0};
    22 int dy[4] = {0, 0, -1, 1};
    23 
    24 void DFS(int x, int y)
    25 {
    26     vis[x][y] = true;
    27     if (maze[x][y] == 'X')    return ;
    28 
    29     for (int i=0; i<4; ++i)
    30     {
    31         int tx = x + dx[i];
    32         int ty = y + dy[i];
    33 
    34         if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && !vis[tx][ty])
    35         {
    36             DFS (tx, ty);
    37         }
    38     }
    39 
    40     return ;
    41 }
    42 
    43 int main(void)        //Codeforces Round #301 (Div. 2) C. Ice Cave
    44 {
    45     //freopen ("C.in", "r", stdin);
    46 
    47     while (scanf ("%d%d", &n, &m) == 2)
    48     {
    49         memset (vis, 0, sizeof (vis));
    50         for (int i=1; i<=n; ++i)
    51         {
    52             scanf ("%s", maze[i]+1);
    53         }
    54         scanf ("%d%d", &sx, &sy);
    55         scanf ("%d%d", &ex, &ey);
    56 
    57         int cnt = 0;    bool flag = false;
    58         for (int i=0; i<4; ++i)
    59         {
    60             int tx = ex + dx[i];
    61             int ty = ey + dy[i];
    62             if (tx == sx && ty == sy)    flag = true;
    63             if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.')    cnt++;
    64         }
    65 
    66         if (sx == ex && sy == ey)
    67         {
    68             if (cnt >= 1)    puts ("YES");
    69             else puts ("NO");
    70         }
    71         else if (flag)
    72         {
    73             if (maze[ex][ey] == 'X')    puts ("YES");
    74             else
    75             {
    76                 if (cnt >= 1)    puts ("YES");
    77                 else    puts ("NO");
    78             }
    79         }
    80         else
    81         {
    82             maze[sx][sy] = '.';
    83             DFS (sx, sy);
    84             if (vis[ex][ey])
    85             {
    86                 if (maze[ex][ey] == 'X')    puts ("YES");
    87                 else if (cnt >= 2)    puts ("YES");
    88                 else    puts ("NO");
    89             }
    90             else    puts ("NO");
    91         }
    92     }
    93 
    94     return 0;
    95 }
     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <queue>
     5 #include <string>
     6 #include <iostream>
     7 using namespace std;
     8 
     9 const int MAXN = 5e2 + 10;
    10 const int INF = 0x3f3f3f3f;
    11 int n, m;
    12 int sx, sy, ex, ey;
    13 char maze[MAXN][MAXN];
    14 bool vis[MAXN][MAXN];
    15 int dx[4] = {1, -1, 0, 0};
    16 int dy[4] = {0, 0, -1, 1};
    17 
    18 bool BFS(void)
    19 {
    20     queue<pair<int, int> > Q;
    21     Q.push (make_pair (sx, sy));
    22 
    23     while (!Q.empty ())
    24     {
    25         int x = Q.front ().first;    int y = Q.front ().second;    Q.pop ();
    26         for (int i=0; i<4; ++i)
    27         {
    28             int tx = x + dx[i];
    29             int ty = y + dy[i];
    30 
    31             if (tx == ex && ty == ey)    return true;
    32 
    33             if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.')
    34             {
    35                 maze[tx][ty] = 'X';
    36                 Q.push (make_pair (tx, ty));
    37             }
    38         }
    39     }
    40 
    41     return false;
    42 }
    43 
    44 int main(void)        //Codeforces Round #301 (Div. 2) C. Ice Cave
    45 {
    46     //freopen ("C.in", "r", stdin);
    47 
    48     while (scanf ("%d%d", &n, &m) == 2)
    49     {
    50         memset (vis, 0, sizeof (vis));
    51         for (int i=1; i<=n; ++i)
    52         {
    53             scanf ("%s", maze[i]+1);
    54         }
    55         scanf ("%d%d", &sx, &sy);
    56         scanf ("%d%d", &ex, &ey);
    57 
    58         int cnt = 0;    bool flag = false;
    59         for (int i=0; i<4; ++i)
    60         {
    61             int tx = ex + dx[i];
    62             int ty = ey + dy[i];
    63             if (tx == sx && ty == sy)    flag = true;
    64             if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && maze[tx][ty] == '.')    cnt++;
    65         }
    66 
    67         if (sx == ex && sy == ey)
    68         {
    69             if (cnt >= 1)    puts ("YES");
    70             else puts ("NO");
    71         }
    72         else if (flag)
    73         {
    74             if (maze[ex][ey] == 'X')    puts ("YES");
    75             else
    76             {
    77                 if (cnt >= 1)    puts ("YES");
    78                 else    puts ("NO");
    79             }
    80         }
    81         else
    82         {
    83             maze[sx][sy] = '.';
    84             //DFS (sx, sy);
    85             if (BFS () == true)
    86             {
    87                 if (maze[ex][ey] == 'X')    puts ("YES");
    88                 else if (cnt >= 2)    puts ("YES");
    89                 else    puts ("NO");
    90             }
    91             else    puts ("NO");
    92         }
    93     }
    94 
    95     return 0;
    96 }
    BFS做法
    编译人生,运行世界!
  • 相关阅读:
    水调歌头·1024
    网页开发方式-从静态页面到服务端渲染
    完美融合 nextjs 和 antd
    commanderJs编写命令行工具(cli)
    [信息安全] 05 X.509 公钥证书的格式标准
    [Cake] 3. dotnet 本地工具 cake & dotnet format
    [计算机网络] 00 概述
    [Cake] 2. dotnet 全局工具 cake
    [解读REST] 0.REST 相关参考资料
    [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4471023.html
Copyright © 2020-2023  润新知