[CH3401]石ゲーム

説明

[CH3401]石ゲーム

解決

以降\(GCD(1,2,3,4,5,6)60 \ =)を、そのようにそれぞれ(\ 60秒)の\固定することができる内変換(\ 60 \)行列、\は( \ FORALL X \ \)[1,60]で、そう[0] = [0]([X] \ 1 \)の安定したストリームの一定の源として
\(F [I] \)からのラインである\ (0 \)する(0 \)\、からカラム\(0 \)\(N \ AST Mが\)を行列表し\(Iは\)状態秒、\(F. [0] [0を] = 1 \)を
行う\(T = 60 * P + Q \) そう\(A \)\(60 \)は行列が乗算され、\(F. [0] \ P * AST A ^ \ ^のProd {Q} _ {i = 1 } F [i]が\) 最終的なマトリックスであっ
に行列内の最大値を見つけます

コード

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define num(x, y) ((x - 1) * m + y)
#define MAXN 110
struct Mat {
    int x, y;
    int val[MAXN][MAXN];
} f[61];
Mat operator * (const Mat &a, const Mat &b) {
    Mat c;
    c.x = a.x;
    c.y = b.y;
    for (register int i = 0; i <= c.x; i++)
        for (register int j = 0; j <= c.y; j++) {
            c.val[i][j] = 0;
            for (register int k = 0; k <= a.y; k++)
                c.val[i][j] += a.val[i][k] * b.val[k][j];
        }
    return c;
}
int n, m, t, act, X, Y, ans;
int c[MAXN], Len[MAXN];
char str[MAXN], s[MAXN][MAXN];
Mat a, HSH;
inline int read() {
    int s = 0, w = 1;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
    for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
    return s * w;
}
Mat Pow(Mat a, int k) {
    Mat ans;
    while (k) {
        if (k % 2) ans = ans * a;
        a = a * a;
        k /= 2;
    }
    return ans;
}
int main() {
    n = read(), m = read(), t = read(), act = read();
    for (register int i = 1; i <= n; i++) {
        scanf("%s", str + 1);
        for (register int j = 1; j <= m; j++)
            c[num(i, j)] = (str[j] ^ 48);
    }
    for (register int i = 0; i < act; i++) {
        scanf("%s", s[i] + 1);
        Len[i] = strlen(s[i] + 1);
    }
    a.x = 0, a.y = 64;
    a.val[0][0] = 1;
    for (register int k = 1; k <= 60; k++) {
        f[k].x = 60;
        f[k].y = 60;
        f[k].val[0][0] = 1;
        for (register int i = 1; i <= n; i++)
            for (register int j = 1; j <= m; j++) {
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '1') f[k].val[0][num(i, j)] = 1;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '2') f[k].val[0][num(i, j)] = 2;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '3') f[k].val[0][num(i, j)] = 3;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '4') f[k].val[0][num(i, j)] = 4;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '5') f[k].val[0][num(i, j)] = 5;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '6') f[k].val[0][num(i, j)] = 6;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '7') f[k].val[0][num(i, j)] = 7;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '8') f[k].val[0][num(i, j)] = 8;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == '9') f[k].val[0][num(i, j)] = 9;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == 'N') f[k].val[num(i, j)][num(i - 1, j)] = 1;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == 'W') f[k].val[num(i, j)][num(i, j - 1)] = 1;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == 'S') f[k].val[num(i, j)][num(i + 1, j)] = 1;
                if (s[c[num(i, j)]][(k - 1) % (Len[c[num(i, j)]]) + 1] == 'E') f[k].val[num(i, j)][num(i, j + 1)] = 1;
            }
    }
    for (register int i = 0; i <= 64; i++)
        HSH.val[i][i] = 1;
    for (register int i = 1; i <= 60; i++)
        HSH = HSH * f[i];
    X = t / 60;
    Y = t % 60;
    if (X) a = a * Pow(HSH, X);
    for (register int i = 1; i <= Y; i++)
        a = a * f[i];
    for (register int i = 1; i <= 64; i++)
        ans = max(ans, a.val[0][i]);
    printf("%d", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/Agakiss/p/11779472.html