1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define MAXN 100 #define LL long long #define pos(i, j) (i-1)*m+j using namespace std;
int n, m, t, act, len[MAXN], op[MAXN][MAXN]; LL maxn, ans[MAXN][MAXN], a[MAXN][MAXN][MAXN], b[MAXN][MAXN]; char opt[MAXN][MAXN];
void init() { ans[0][0]=1; for(int i=0; i<=pos(n, m); i++) b[i][i]=1; for(int i=0; i<60; i++) a[i][0][0]=1; }
void mul(LL x[MAXN][MAXN], LL y[MAXN][MAXN]) { LL c[MAXN][MAXN]; memset(c, 0, sizeof(c)); for(int i=0; i<=n*m; i++) for(int j=0; j<=n*m; j++) for(int k=0; k<=n*m; k++) c[i][j]+=x[i][k]*y[k][j]; memcpy(x, c, sizeof(c)); }
void ksm(int y) { while(y) { if(y&1) mul(ans, b); mul(b, b); y>>=1; } }
int main() { scanf("%d%d%d%d", &n, &m, &t, &act); init(); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%1d", &op[i][j]); for(int i=0; i<act; i++) { scanf("%s", opt[i]); len[i]=strlen(opt[i]); } for(int k=0; k<60; k++) { for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { char act=opt[op[i][j]][k%len[op[i][j]]]; if(act=='E' && j<m) a[k][pos(i, j)][pos(i, j+1)]=1; if(act=='N' && i>1) a[k][pos(i, j)][pos(i-1, j)]=1; if(act=='W' && j>1) a[k][pos(i, j)][pos(i, j-1)]=1; if(act=='S' && i<n) a[k][pos(i, j)][pos(i+1, j)]=1; if(act>='0' && act<='9') { a[k][pos(i, j)][pos(i, j)]=1; a[k][0][pos(i, j)]=act-'0'; } } mul(b, a[k]); } ksm(t/60); for(int i=0; i<t%60; i++) mul(ans, a[i]); for(int i=1; i<=n*m; i++) maxn=max(maxn, ans[0][i]); printf("%lld\n", maxn); }
|