Escape
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <stdio.h>
#include <stack>
#include <queue>
using namespace std;
#define maxn 155555
int n,m,k,d,x,y,t,v,cnt,ind;
map<pair<int,int>,int>mmp;
vector<pair<int,int> >book[maxn];
char s;
struct node
{
int x,y,step;
} top,temp;
int to[5][2]= {{0,1},{0,-1},{1,0},{-1,0},{0,0}};
bool judge(node c)
{
bool flag=0;
if(c.x<0||c.y<0||c.x>n||c.y>m)
return false;
int len=book[mmp[make_pair(c.x,c.y)]].size();
for(int i=0; i<len; i++)
if(book[mmp[make_pair(c.x,c.y)]][i].first==-1)
return true;
else if((top.step-book[mmp[make_pair(c.x,c.y)]][i].first)%book[mmp[make_pair(c.x,c.y)]][i].second==0)
flag=1;
if(flag)
return false;
return true;
}
void bfs()
{
queue<node>q;
q.push((node)
{
0,0,0
});
while(!q.empty())
{
top=q.front();
// cout<<top.x<<endl;
q.pop();
if(top.step>d)
continue;
if(top.x==n&&top.y==m)
{
cout<<top.step<<endl;
return ;
}
temp.step=top.step+1;
for(int i=0; i<=4; i++)
{
temp.x=top.x+to[i][0];
temp.y=top.y=to[i][1];
if(judge(temp))
q.push(temp);
}
}
cout<<"Bad luck!"<<endl;
return ;
}
int main()
{
while(cin>>n>>m>>k>>d)
{
ind=0;
for(int i=0; i<=n*m; i++)
book[i].clear();
mmp.clear();
while(k--)
{
cin>>s>>t>>v>>x>>y;
if(mmp[make_pair(x,y)]==0)
mmp[make_pair(x,y)]=++ind;
book[mmp[make_pair(x,y)]].push_back(make_pair(-1,0));
if(s=='W')
{
y-=v;
if(y>=0)
{
if(mmp[make_pair(x,y)]==0)
mmp[make_pair(x,y)]=++ind;
book[mmp[make_pair(x,y)]].push_back(make_pair(v,t));
}
}
else if(s=='N')
{
x-=v;
if(x>=0)
{
if(mmp[make_pair(x,y)]==0)
mmp[make_pair(x,y)]=++ind;
book[mmp[make_pair(x,y)]].push_back(make_pair(v,t));
}
}
else if(s=='S')
{
x+=v;
if(x<=n)
{
if(mmp[make_pair(x,y)]==0)
mmp[make_pair(x,y)]=++ind;
book[mmp[make_pair(x,y)]].push_back(make_pair(v,t));
}
}
else
{
y+=v;
if(y<=m)
{
if(mmp[make_pair(x,y)]==0)
mmp[make_pair(x,y)]=++ind;
book[mmp[make_pair(x,y)]].push_back(make_pair(v,t));
}
}
}
bfs();
}
}