Ice Cave

题目链接:

https://vjudge.net/contest/345248#problem/L

题面:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

翻译:

你玩电脑游戏。你的角色站在一个多层次冰洞的某个层面上。为了向前走,你需要下降一层,唯一的方法就是从冰上掉下来。
你所在的洞穴的水平面是一个由n行和m列组成的矩形方格。每个细胞由完整的或破裂的冰组成。你可以从每个单元移动到与你相邻的单元(由于游戏引擎的某些限制,你不能在同一个地方跳跃,即从一个单元跳到它自己)。如果你移动到有碎冰的牢房,那么你的角色会从里面掉下来,如果你移动到有完整冰的牢房,那么这个牢房上的冰就会裂开。
让我们把整数从1到n的行从上到下编号,把整数从1到m的列从左到右编号。让我们把第r行和第c列的交集上的单元格表示为(r, c)。
你呆在牢房里(r1, c1),这个牢房破裂了,因为你刚从一个更高的地方掉下来。你需要通过单元格(R2,C2)倒下,因为到下一个层次的出口就在那里。你能做到吗?

输入

第一行包含两个整数,n和m(1 ≤ n, m ≤ 500)-洞穴描述中的行数和列数。
接下来的n行中的每一行描述了洞穴的初始状态,每行由m个字符“.”(即完整冰)和“X”(碎冰)组成。
下一行包含两个整数,r1和c1(1 ≤ r1 ≤ n, 1 ≤ c1 ≤ m)-初始坐标。可以保证洞穴的描述包含单元格(r1, c1)中的字符“X”,也就是说,起始单元格上的冰最初会破裂。
下一行包含两个整数r2和c2(1 ≤ r2 ≤ n, 1 ≤ c2 ≤ m)-需要坠落的单元格坐标。最后一个单元格可能与起始单元格重合。

输出
如果可以到达目的地,请打印“是”,否则打印“否”。

笔记:
在第一个样本测试中,一个可能的路径是:
在这里插入图片描述
在第一次访问cell(2, 2)后,它上面的冰会裂开,当你第二次踏到那里时,你的角色会按预期的方式掉进冰中。

思路:

这道题目的思路就是你要从一个点找到另一个点,但是在走过去的过程中你不能掉下去,所以你就不能在除要出去的那个点的碎冰,不然你就直接掉下去,不能成功到达目的地,所以我们能走的点就是不为碎片的点和为碎片的点但是这个点为终点,这里我们就要注意的是当不为碎冰的点走过以后,这个点就成为了碎冰,我们就可以把它继续重新标记为碎冰的点。然后这就是一个bfs1的问题了

参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 505;
int dir[4][2]= {1,0,-1,0,0,1,0,-1};
char map[maxn][maxn];
int n,m;
int sx,sy,ex,ey;
bool judge(int x,int y)//判断是否越界的函数
{
    if(x > 0 && x <=n && y > 0 && y <=m)
        return true;
    return false;
}
bool bfs()
{
    queue<int>qx,qy;
    qx.push(sx);
    qy.push(sy);//先把起点的x,y插入队列
    while(!qx.empty())//如果队列不为空
    {
        int x = qx.front();//找到队首的x坐标
        qx.pop();//删除队首的x坐标
        int y = qy.front();//找到队首的y坐标
        qy.pop();//删除队首的y坐标
        for(int i = 0; i < 4; i++)//四个方向继续查找
        {
            int xx = x + dir[i][0];
            int yy = y + dir[i][1];
            if(judge(xx,yy))//如果没有越界,就继续判断
            {
                if(map[xx][yy] == 'X')//如果为碎冰
                {
                    if(xx == ex && yy == ey)//当是为终点时说碎冰,那么就直接找到出去的路,返回ture
                        return true;
                }
                else//如果不是碎冰,那么就可以走,但是走给之后它就成为了碎冰
                {
                    map[xx][yy] = 'X';//所以把这个点标记为碎冰
                    qx.push(xx);//把这个点的x坐标插入队列
                    qy.push(yy);//把这个点的y坐标插入队列
                }
            }
        }
    }
    return false;//如果最后一直没有找到,就返回flase
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++)
    {
        scanf("%s",map[i]+1);//这样子输入,可以保证这个地图的坐标是从1到n,是个n*n的坐标图
    }
    scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
    if(bfs())//如果最后找到了出去的路,就会返回ture,就运行这个语句,输出yes
        printf("YES\n");
    else//找不到就输出no
        printf("NO\n");
    return 0;
}

发布了55 篇原创文章 · 获赞 12 · 访问量 8961

猜你喜欢

转载自blog.csdn.net/qq_45740533/article/details/103645169
ice