zoukankan      html  css  js  c++  java
  • CodeForces 540C Ice Cave

    Description:

    You play a computer game. Your character stands on some level of a multilevel ice cave. In order to move on forward, you need to descend one level lower and the only way to do this is to fall through the ice.

    The level of the cave where you are is a rectangular square grid of n rows and m columns. Each cell consists either from intact or from cracked ice. From each cell you can move to cells that are side-adjacent with yours (due to some limitations of the game engine you cannot make jumps on the same place, i.e. jump from a cell to itself). If you move to the cell with cracked ice, then your character falls down through it and if you move to the cell with intact ice, then the ice on this cell becomes cracked.

    Let's number the rows with integers from 1 to n from top to bottom and the columns with integers from 1 to m from left to right. Let's denote a cell on the intersection of the r-th row and the c-th column as (r, c).

    You are staying in the cell (r1, c1) and this cell is cracked because you've just fallen here from a higher level. You need to fall down through the cell (r2, c2) since the exit to the next level is there. Can you do this?

    Input:

    The first line contains two integers, n and m (1 ≤ n, m ≤ 500) — the number of rows and columns in the cave description.

    Each of the next n lines describes the initial state of the level of the cave, each line consists of m characters "." (that is, intact ice) and "X" (cracked ice).

    The next line contains two integers, r1 and c1 (1 ≤ r1 ≤ n, 1 ≤ c1 ≤ m) — your initial coordinates. It is guaranteed that the description of the cave contains character 'X' in cell (r1, c1), that is, the ice on the starting cell is initially cracked.

    The next line contains two integers r2 and c2 (1 ≤ r2 ≤ n, 1 ≤ c2 ≤ m) — the coordinates of the cell through which you need to fall. The final cell may coincide with the starting one.

    Output:

    If you can reach the destination, print 'YES', otherwise print 'NO'.

    Sample Input:

    Input:
    4 6
    X...XX
    ...XX.
    .X..X.
    ......
    1 6
    2 2
    Output:
    YES
    Input:
    5 4
    .X..
    ...X
    X.X.
    ....
    .XX.
    5 3
    1 1
    Output:
    NO
    Input:
    4 7
    ..X.XX.
    .XX..X.
    X...X..
    X......
    2 2
    1 6
    Output:
    YES

    Hint:

    In the first sample test one possible path is:

    After the first visit of cell (2, 2) the ice on it cracks and when you step there for the second time, your character falls through the ice as intended.

    题意:给出一张地图(地图中只有'.'和'X','.'代表完整冰块,'X'代表不完整冰块)和两个点的位置A(r1,c1),B(r2,c2)判断能否从A到B点,并从B点出去,A点肯定是'X',可以从B点出去的条件是B点必须也是'X',但是从A点到B点经过的点必须都是'.',那么当B点不是'X'时,我们需要再次到达B点,才能出去(每次达到'.'后,该点变为'X')。

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    
    const int N=1e6+10;
    const int INF=0x3f3f3f3f;
    const int MOD=1e9;
    
    typedef long long LL;
    
    int n, m, r1, c1, r2, c2;
    char Map[510][510];
    int vis[510][510];
    int dir[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };
    
    struct node
    {
        int x, y;
    };
    
    int BFS(int r, int c)
    {
        int i, x, y;
    
        node now, next;
        queue<node>Q;
    
        vis[r][c] = 1;
        now.x = r;
        now.y = c;
        Q.push(now);
    
        while (!Q.empty())
        {
            now = Q.front();
            Q.pop();
    
            for (i = 0; i < 4; i++)
            {
                next.x = x = now.x+dir[i][0];
                next.y = y = now.y+dir[i][1];
    
                if (x >= 0 && x < n && y >= 0 && y < m)
                {
                    if (x == r2-1 && y == c2-1 && Map[r2-1][c2-1] == 'X') return 1; 
    
                    if (Map[x][y] == '.')
                    {
                        Q.push(next);
                        vis[x][y] = 1;
                        Map[x][y] = 'X'; ///将每个可以到达的点置为'X',那么假如B点开始是'.',第一次到达后变为'X',那么下次如果再次经过B点时,B点是'X',可以出去
                    }
                }
            }
        }
    
        return 0;
    }
    
    int main ()
    {
        int i, flag;
    
        while (scanf("%d%d", &n, &m) != EOF)
        {
            for (i = 0; i < n; i++)
                scanf("%s", Map[i]);
            scanf("%d%d", &r1, &c1);
            scanf("%d%d", &r2, &c2);
    
            memset(vis, 0, sizeof(vis));
    
            flag = BFS(r1-1, c1-1);
    
            if (flag == 1) printf("YES
    ");
            else printf("NO
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    SVN操作指南
    .NET Tools
    SQL条件查询控件
    txt文件导入Sql Server数据库表方法
    黑盒测试用例设计方法
    JS库
    在 C# 中 ("x" == "X") 何时成立?
    奶牛问题,别人写的,自己试了一下.
    Some Cool Tips For .NET
    Excel Data Reader Read Excel files in .NET
  • 原文地址:https://www.cnblogs.com/syhandll/p/4977659.html
Copyright © 2011-2022 走看看