對於所有在時間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; }
沒有留言:
張貼留言