难道是爆出long long的原因?
#include<bits/stdc++.h>
using namespace std;
const char dposs[5]="URDL";
const int w[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct ZS{
int x,y,w;
}a[10][20005];
int n,m,k;
int X,Y;
int b[10],p[10];
int mp[10][55][55];
long long ans=-1;
long long fist[5][10],fr[5][10];
inline int read(){
int ret=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
return ret*f;
}
int check(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;}
void BFS(int x){
int now=0;
while(now<=20000){
int nxtx=a[x][now].x,nxty=a[x][now].y,nxtw=(a[x][now].w+mp[x][nxtx][nxty])%4;
if(!check(nxtx+w[nxtw][0],nxty+w[nxtw][1]))nxtw=(nxtw+2)%4;
a[x][now+1]=(ZS){nxtx+w[nxtw][0],nxty+w[nxtw][1],nxtw};
now++;
}
}
int good(long long cval,int i){
if(fr[p[i]][i]==-1)return cval==fist[p[i]][i];
if(cval<fist[p[i]][i])return 0;
return ((fist[p[i]][i]-cval)%fr[p[i]][i])==0;
}
long long gcd(long long a,long long b){return !b?a:gcd(b,a%b);}
long long solve(){
long long cval=-1;
for(int i=1;i<=k;i++){
if(fist[p[i]][i]==-1)return -1;
if(fr[p[i]][i]==-1)cval=fist[p[i]][i];
}
if(cval!=-1){
for(int i=1;i<=k;i++)if(!good(cval,i))return -1;
return cval;
}
int hloc=1;
for(int i=2;i<=k;i++)if(fist[hloc]<fist[i])hloc=i;
long long Ans=fist[p[hloc]][hloc],mult=fr[p[hloc]][hloc];
for(int i=1;i<=k;i++){
if(i==hloc)continue;
int cnt=0;
while(Ans%fr[p[i]][i]!=fist[p[i]][i]%fr[p[i]][i]&&cnt<=fr[p[i]][i])cnt++,Ans+=mult;
if(cnt>fr[p[i]][i])return -1;
mult*=fr[p[i]][i]/gcd(mult,fr[p[i]][i]);
}
return Ans;
}
int main(){
memset(fist,-1,sizeof fist);memset(fr,-1,sizeof fr);
n=read();m=read();k=read();X=read();Y=read();
for(int i=1;i<=k;i++){
int x=read(),y=read();char ch=getchar();
for(int j=0;j<=3;j++)if(dposs[j]==ch)b[i]=j;
a[i][0]=(ZS){x,y,b[i]};
for(int j=1;j<=n;j++){getchar();
for(int k=1;k<=m;k++)mp[i][j][k]=(getchar()-'0')%4;}
}
for(int i=1;i<=k;i++)BFS(i);
for(int i=1;i<=k;i++){
for(int f=0;f<=3;f++)
for(int j=0;j<=20000;j++)if(a[i][j].x==X&&a[i][j].y==Y&&a[i][j].w==f)fr[f][i]=fr[f][i]==-1?(fist[f][i]==-1?-1:j-fist[f][i]):fr[f][i],fist[f][i]=fist[f][i]==-1?j:fist[f][i];
}
for(int s=0;s<=1<<(2*k);s++){
int temp=s;
for(int i=1;i<=k;i++)p[i]=temp%4,temp/=4;
long long cnt=solve();
if(cnt==-1)continue;
ans=ans==-1?cnt:min(ans,cnt);
}
printf("%lld",ans==-1?-1:ans+1);
return 0;
}