CodeForces 1236D(模擬)

題意

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

最近,愛麗絲獲得了一個新玩偶。它甚至能夠走路!ios

愛麗絲爲玩偶建造了一個迷宮,並想對其進行測試。迷宮具備n行和m列。有k個障礙物,第i個障礙物位於單元格(xi,yi)上,這意味着第xi個行與第yi列相交的單元格上存在一個禁止經過的障礙物。c++

然而,玩偶有着缺陷。在同一單元格(包括起始單元格)中,它最多隻能筆直走或右轉一次。它沒法進入有障礙物的單元格或走出迷宮的界限以外。測試

如今,愛麗絲正在控制娃娃的動做。她將玩偶放入單元格(1,1)(即迷宮的左上角)中。最初,玩偶的朝向從(1,1)向着(1,m)。她想讓玩偶剛好穿過一次全部單元格而沒有障礙,玩偶的行動能夠在任何地方結束。愛麗絲的想法能夠實現嗎?spa

思路

這題細節很是多,可是也很好寫,直接模擬就好了。可是一步一步的走確定會T,咱們能夠維護每一行、每一列的障礙物,上下左右邊界,每次走的時候直接跳到最近的障礙物前面便可。.net

注意幾個坑:htm

1.(1,1)正前方(1,2)有障礙物,能夠直接右轉,這裏要特判一下。blog

2.每跳一次,判斷前面那個位置是不是不可行的點,這裏我用上述的上下左右邊界判斷,若是是,那麼走不通了,break便可。ci

代碼

#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
*/
相關文章
相關標籤/搜索