2015年4月10日 星期五

103北市賽 1.水晶球 (Crystal Ball)

想法:

對於所有在時間t-1可以到的格子b, 把第t秒的格子b的上下左右d_t格設為true。

雖然看時間複雜度有點危險(O(4*10^8)),
但其實有一些cut可以加(ex. 表被填滿了就跳出),
又有5秒可以跑,
應該可以直接AC。

Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <utility>
#define pii pair<int,int>
using namespace std;
int mp[2][105][105];
int mv[10005];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n,m,k;
pii src,tar;
#define x first
#define y second
inline int get(int a,int b){return (a%b+b)%b;}
bool sol()
{
    int p=0;
    mp[p][src.x][src.y]=1;
    for(int t=1;t<=k;t++)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(mp[p][i][j]==t)
                    for(int v=0;v<4;v++)
                        mp[p^1][get(i+dx[v]*mv[t],n)][get(j+dy[v]*mv[t],m)]=t+1;
        p^=1;
    }
    return mp[p][tar.x][tar.y]==k+1;
}
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%d%d%d%d",&src.x,&src.y,&tar.x,&tar.y);
    scanf("%d",&k);
    for(int i=1;i<=k;i++)
        scanf("%d",&mv[i]);
    puts(sol()?"YES":"NO");
    return 0;
}

沒有留言:

張貼留言