牛客假日团队赛6 F. Mud Puddles

F. Mud Puddles

题目链接:https://ac.nowcoder.com/acm/contest/993/F

题目:

农夫约翰早上6点离开家,每天挤奶贝西。然而,前一天晚上看到一场大雨,田野非常泥泞。 FJ从坐标平面中的点(0,0)开始,朝向位于(X,Y)的Bessie(-500≤X≤500;-500≤Y≤500)。他可以看到所有N(1≤N≤10,000)泥浆的水坑,位于油田的点(Ai,Bi)(-500≤Ai≤500;-500≤Bi≤500)。每个水坑只占据它所在的点。
刚刚买了新靴子,Farmer John绝对不想踩到水坑弄脏他们,但他也希望尽快到达Bessie。他已经迟到了,因为他不得不算上所有的水坑。如果Farmer John只能平行于轴行进并转向带有整数坐标的点,那么他必须前往Bessie并保持靴子清洁的最短距离是多少? Farmer John可以带着一条没有泥浆的路径到达Bessie。
输入描述:

*第1行:三个空格分隔的整数:X,Y和N.
*行2..N 1:行i 1包含两个空格分隔的整数:Ai和Bi

输出描述:

*第1行:Farmer John必须前往Bessie而不踩泥的最小距离。

思路:BFS宽搜,稍微变化一下,由于坐标存在负值将起始点变为(500,500)

越界条件变为<0||>1000,终点变为X+500,Y+500,将1000*1000的矩阵初始化为0,然后有泥坑的地方赋值为1,搜索时遇到1就不走,代码如下:

 

//
// Created by hy on 2019/7/13.
//
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1005;
int zou[maxn][maxn];
bool is[maxn][maxn];
struct node{
    int x;
    int y;
    int dept;
};
int x,y;
int dic[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int bfs()
{
    queue<node>qu;
    node now,next;
    now.x=500;
    now.y=500;
    now.dept=0;
    is[500][500]=1;
    qu.push(now);
    while(!qu.empty())
    {
        now=qu.front();
        qu.pop();
        if(now.x==x+500&&now.y==y+500)
            return now.dept;
        for(int i=0;i<4;i++)
        {
            int xx=now.x+dic[i][0];
            int yy=now.y+dic[i][1];
            if(xx<0||xx>1000||yy<0||yy>1000)
                continue;
            if(zou[xx][yy]==0&&!is[xx][yy])
            {
                is[xx][yy]=1;
                next.x=xx;
                next.y=yy;
                next.dept=now.dept+1;
                qu.push(next);
            }
        }
    }
    return 0;
}
int main()
{
    int n;
    cin>>x>>y>>n;
    memset(is,0,sizeof(is));
    memset(zou,0,sizeof(zou));
    int p,q;
    for(int i=0;i<n;i++)
    {
        cin>>p>>q;
        zou[p+500][q+500]=1;
    }
    cout<<bfs()<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/Vampire6/p/11187759.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值