寻找豆汁(Easy)2025.3.29平顶山学院ACM排位赛

废话不多说先看题目

本题为寻找豆汁 ( Hard ) 的简单版本,其中部分题面不同,为避免歧义,重新阅读题面。

题目描述

由于 ymr 十分想喝豆汁,所以小劉帮他买了一杯放在了一个地方,但是 ymr 去拿豆汁的途中路途坎坷,有许多的障碍,现在 ymr 向你询问他是否能够拿到豆汁。


 

现在假设 ymr 和豆汁都存在在一个棋盘上,其中每个格子用 Si , j 表示。

当且仅当 Si , j 只会为 ' . ' , ' # ' , 其中' . '表示可以通行,' # '表示不可通过。

确保 ymr 和豆汁所在处不会出现障碍。

ymr 起初在 ( x , y ) 处,他可以向八个方向行进: 上,下,左,右,左上,左下,右上,右下

若 ymr 能够拿到豆汁则输出 "YES",否则输出 "NO"。

输入描述

每组测试数据描述如下:

第一行两个数字 n , m ( 1 <= n , m <= 1000 ) 表示棋盘的长和宽。

接下来 n 行,每行 m 个字符 Si , j

最后一行四个数字 x1 , y1 , x2 , y2 ( 1 <= x1 , x2 <= n) ( 1 <= y1 , y2 <= m) 分别表示 ymr 所在的坐标,豆汁所在的坐标。

输出描述

若 ymr 能够拿到豆汁则输出 "YES",否则输出 "NO"。

输出 "yes","yeS","yEs',"yES","Yes","YeS","YEs"均视为与 "YES" 一致,"No","no","nO"均视为与 "NO" 一致。

样例

输入数据 1

3 3
...
...
...
1 1 3 3

Copy

输出数据 1

YES

很明显这儿是一道 BFS一道广搜的题目,不了解广搜的小伙伴们可以点击下方链接呦~~~(●'◡'●)第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)_dfs bfs-CSDN博客

先上代码,再根据代码解释其内涵的逻辑性

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>

using namespace std;

const int dx[8] = {-1,-1,-1,0,0,1,1,1};
const int dy[8] = {-1,0,1,-1,1,-1,0,1};

bool bfs(vector<string>&board,int x1,int y1,int x2,int y2) 
{
    int n=board.size();
    int m=board[0].size();
    vector<vector<bool> >visited(n,vector<bool>(m,false));
    queue<pair<int,int> >q;

    q.push(make_pair(x1,y1));
    visited[x1][y1]=true;

    while(!q.empty())
    {
        pair<int,int>front=q.front();
        int x=front.first;
        int y=front.second;
        q.pop();
        if(x==x2&&y==y2)return true;
        for(int i=0;i<8;++i) 
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if (nx>=0&&nx<n&&ny>=0&&ny<m&&board[nx][ny]=='.'&&!visited[nx][ny]) 
            {
                q.push(make_pair(nx,ny));
                visited[nx][ny]=true;
            }
        }
    }
    return false;
}

int main() 
{
    int n,m;
    cin>>n>>m;

    vector<string>board(n);

    for (int i=0;i<n;++i)cin>>board[i];
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    --x1;
    --y1;
    --x2;
    --y2;
    if(bfs(board,x1,y1,x2,y2))cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}  

头文件没啥好说的,无脑写的,当然如果编译器允许则#include<bits/stdc++.h>最好

using namespace std;

const int dx[8] = {-1,-1,-1,0,0,1,1,1};//因为有八个方位则设定八个方位的预制,其核心内涵为从该中心,向外搜索,即分别加(-1,-1)以此类推
const int dy[8] = {-1,0,1,-1,1,-1,0,1};

下面是BFS的模板

bool bfs(vector<string>&board,int x1,int y1,int x2,int y2) 
{
    int n=board.size();
    int m=board[0].size();
    vector<vector<bool> >visited(n,vector<bool>(m,false));//visited记录访问状态
    queue<pair<int,int> >q;//开队列,进行BFS

    q.push(make_pair(x1,y1));
    visited[x1][y1]=true;

    while(!q.empty())
    {
        pair<int,int>front=q.front();
        int x=front.first;
        int y=front.second;
        q.pop();
        if(x==x2&&y==y2)return true;
        for(int i=0;i<8;++i) //以该点为中心检测其周围的‘.’
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if (nx>=0&&nx<n&&ny>=0&&ny<m&&board[nx][ny]=='.'&&!visited[nx][ny]) 
            {//检测是否越界,以及到达指定该位置
                q.push(make_pair(nx,ny));
                visited[nx][ny]=true;
            }
        }
    }
    return false;
}

下面是主函数的代码

int main() 
{
    int n,m;
    cin>>n>>m;

    vector<string>board(n);//开string记录其长度

    for (int i=0;i<n;++i)cin>>board[i];
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    --x1;//数组下标从零开始,故减去1
    --y1;
    --x2;
    --y2;
    if(bfs(board,x1,y1,x2,y2))cout<<"YES"<<endl;//判断返回是否为真,来输出答案
    else cout<<"NO"<<endl;
    return 0;
}  

提示:建议要跟小组成员的代码风格一致,但是以后工作要用英文去命名(别问我怎么额知道的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值