• CodeForces 1236D(模拟)


    题意

    https://vjudge.net/problem/CodeForces-1236D

    最近,爱丽丝得到了一个新玩偶。它甚至可以走路!

    爱丽丝为玩偶建造了一个迷宫,并想对其进行测试。迷宫具有n行和m列。有k个障碍物,第i个障碍物位于单元格(xi,yi)上,这意味着第xi个行与第yi列相交的单元格上存在一个禁止通过的障碍物。

    然而,玩偶有着缺陷。在同一单元格(包括起始单元格)中,它最多只能笔直走或右转一次。它无法进入有障碍物的单元格或走出迷宫的界限之外。

    现在,爱丽丝正在控制娃娃的动作。她将玩偶放入单元格(1,1)(即迷宫的左上角)中。最初,玩偶的朝向从(1,1)向着(1,m)。她想让玩偶恰好穿过一次所有单元格而没有障碍,玩偶的行动可以在任何地方结束。爱丽丝的想法可以实现吗?

    思路

    这题细节非常多,但是也很好写,直接模拟就行了。但是一步一步的走肯定会T,我们可以维护每一行、每一列的障碍物,上下左右边界,每次走的时候直接跳到最近的障碍物前面即可。

    注意几个坑:

    1.(1,1)正前方(1,2)有障碍物,可以直接右转,这里要特判一下。

    2.每跳一次,判断前面那个位置是否是不可行的点,这里我用上述的上下左右边界判断,如果是,那么走不通了,break即可。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define inf 0x3f3f3f3f
    #define ll long long
    const int N=200005;
    const int mod=1e9+7;
    const double eps=1e-8;
    const double PI = acos(-1.0);
    #define lowbit(x) (x&(-x))
    vector<ll> g[N],gg[N];
    int main()
    {
        std::ios::sync_with_stdio(false);
        ll n,m,k;
        cin>>n>>m>>k;
        int bb=0;
        for(int i=1; i<=k; i++)
        {
            ll x,y;
            cin>>x>>y;
            g[x].push_back(y);
            gg[y].push_back(x);
        }
        ll l=1,r=m,u=1,d=n;
        ll x=1,y=1,sum=1;
        if(k==0)
        {
            cout<<"Yes"<<endl;
            return 0;
        }
        int sz=g[x].size(),flag=0;
        if(sz==m-1)
            flag=1;
        ll t;//最近的符合要求的位置+1
        while(1)
        {
            if(!flag)
            {
                sz=g[x].size();
                t=r+1;
                for(int i=0; i<sz; i++)
                {
                    if(g[x][i]>y)
                        t=min(t,g[x][i]);
                }
                if(t-y==1)
                    break;
                sum+=t-y-1,y=t-1,r=t-1-1,u=x+1;
            }
            //    cout<<x<<" "<<y<<" "<<sum<<endl;
            //     cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
            sz=gg[y].size();
            t=d+1;
            for(int i=0; i<sz; i++)
            {
                if(gg[y][i]>x)
                {
                    t=min(t,gg[y][i]);
                }
            }
            if(t-x==1)
                break;
            sum+=t-x-1,x=t-1,d=t-1-1;
            //     cout<<x<<" "<<y<<" "<<sum<<endl;
            //     cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
            sz=g[x].size();
            t=l-1;
            for(int i=0; i<sz; i++)
            {
                if(g[x][i]<y)
                {
                    t=max(t,g[x][i]);
                }
            }
            if(y-t==1)
                break;
            sum+=y-t-1,y=t+1,l=t+1+1;
            //       cout<<x<<" "<<y<<" "<<sum<<endl;
            //       cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
            sz=gg[y].size();
            t=u-1;
            for(int i=0; i<sz; i++)
            {
                if(gg[y][i]<x)
                {
                    t=max(t,gg[y][i]);
                }
            }
            if(x-t==1)
                break;
            sum+=x-t-1,x=t+1,u=t+1+1;
            //      cout<<x<<" "<<y<<" "<<sum<<endl;
            //      cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
        }
        //  cout<<sum<<endl;
        if(sum+k==n*m)
        {
            cout<<"Yes"<<endl;
        }
        else
            cout<<"No"<<endl;
        return 0;
    }
    /*
    2 2 2
    1 2
    2 2
    */
    

      

  • 相关阅读:
    ruby直接底层连接数据库
    debian和ubuntu的sh dash bash
    find locate
    apt-get
    ERROR: The partition with /var/lib/mysql is too full! failed!
    linux访问ftp服务器命令
    win7配置ftp服务器
    黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
    黑马程序员_Java基础视频-深入浅出精华版--视频列表
    转:Java项目开发规范参考
  • 原文地址:https://www.cnblogs.com/mcq1999/p/11921919.html
Copyright © 2020-2023  润新知