zoukankan      html  css  js  c++  java
  • 牛客假日团队赛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;
    }
  • 相关阅读:
    如何获取QQ的clientkey
    自动输入QQ密码
    Ext Tree 操作类
    QQ消息记录文件压缩方法
    见过最恶心的代码,发泄一下。。。
    今天尝试获取QQ的clientkey未果,做个记号
    用c# 调用并调试c++的代码
    托盘管理 隐藏/显示/单击/右键/双击/改变位置
    在XP下是可以查看进程命令行参数的
    充分利用你的“二脑”
  • 原文地址:https://www.cnblogs.com/Vampire6/p/11187759.html
Copyright © 2011-2022 走看看