
4 4 3 10 N 1 1 1 1 W 1 1 3 2 W 2 1 2 4 4 4 3 10 N 1 1 1 1 W 1 1 3 2 W 1 1 2 4
9 Bad luck!
#include <stdio.h>
struct S{
int x,y,time;
}que[1000000],t;
struct{
char c;
int time,v;
}mp[101][101];
int nxt[5][2]={{0,1},{1,0},{0,-1},{-1,0},{0,0}};
bool vis[101][101][1001];
int main()
{
int n,m,k,d,i,j,time,v,x,y,dis;
char s[5];
while(~scanf("%d%d%d%d",&n,&m,&k,&d))
{
for(i=0;i<=n;i++) for(j=0;j<=m;j++) mp[i][j].time=0;
while(k--)
{
scanf("%s%d%d%d%d",s,&time,&v,&x,&y);
mp[x][y].time=time;
mp[x][y].v=v;
mp[x][y].c=s[0];
}
for(i=0;i<=n;i++) for(j=0;j<=m;j++) for(k=0;k<=d;k++) vis[i][j][k]=0;
int top=0,bottom=1;
que[0].x=0;
que[0].y=0;
que[0].time=0;
while(top<bottom)
{
t=que[top];
if(t.x==n && t.y==m)
{
printf("%d\n",t.time);
break;
}
t.time++;
for(i=0;i<5;i++)
{
t.x+=nxt[i][0];
t.y+=nxt[i][1];
if(t.x>=0 && t.x<=n && t.y>=0 && t.y<=m && !mp[t.x][t.y].time && !vis[t.x][t.y][t.time] && t.time<=d)
{
bool flag=1;
for(j=t.x-1;j>=0;j--)
{
if(mp[j][t.y].time && mp[j][t.y].c=='S')
{
dis=t.x-j;
if(dis%mp[j][t.y].v) break;
time=t.time-dis/mp[j][t.y].v;
if(time<0) break;
if(time%mp[j][t.y].time==0)
{
flag=0;
break;
}
}
if(mp[j][t.y].time) break;
}
if(!flag)
{
t.x-=nxt[i][0];
t.y-=nxt[i][1];
continue;
}
for(j=t.x+1;j<=n;j++)
{
if(mp[j][t.y].time && mp[j][t.y].c=='N')
{
dis=j-t.x;
if(dis%mp[j][t.y].v) break;
time=t.time-dis/mp[j][t.y].v;
if(time<0) break;
if(time%mp[j][t.y].time==0)
{
flag=0;
break;
}
}
if(mp[j][t.y].time) break;
}
if(!flag)
{
t.x-=nxt[i][0];
t.y-=nxt[i][1];
continue;
}
for(j=t.y-1;j>=0;j--)
{
if(mp[t.x][j].time && mp[t.x][j].c=='E')
{
dis=t.y-j;
if(dis%mp[t.x][j].v) break;
time=t.time-dis/mp[t.x][j].v;
if(time<0) break;
if(time%mp[t.x][j].time==0)
{
flag=0;
break;
}
}
if(mp[t.x][j].time) break;
}
if(!flag)
{
t.x-=nxt[i][0];
t.y-=nxt[i][1];
continue;
}
for(j=t.y+1;j<=m;j++)
{
if(mp[t.x][j].time && mp[t.x][j].c=='W')
{
dis=j-t.y;
if(dis%mp[t.x][j].v) break;
time=t.time-dis/mp[t.x][j].v;
if(time<0) break;
if(time%mp[t.x][j].time==0)
{
flag=0;
break;
}
}
if(mp[t.x][j].time) break;
}
if(!flag)
{
t.x-=nxt[i][0];
t.y-=nxt[i][1];
continue;
}
vis[t.x][t.y][t.time]=1;
que[bottom++]=t;
}
t.x-=nxt[i][0];
t.y-=nxt[i][1];
}
top++;
}
if(top==bottom) puts("Bad luck!");
}
}原文:http://blog.csdn.net/faithdmc/article/details/38873295