牛のゲスト1024B石ゲーム

タイトル説明

一件のゲーム石で\(\ N-) OK \(m個\)カラム\((1個の\当量のN、 Mの\の当量8)(1≤n、m≤8)\) グリッド上に担持され、各グリッドに対応します配列を操作する方法は、最大10種、0~9までの動作シーケンスは、それぞれ10桁を示します。
6サイクルが第2の文字列ごとに実行されるよりも長い一連の操作ではありません。毎秒、すべてのグリッドは、次の文字のそれぞれの動作のシーケンスを実行します。シーケンス内の各文字は、次の形式のいずれかである:
デジタル\(0 \テキスト{ - } 9 \) :取る表す\(0 \テキスト{ - } 9 \) グリッドに石。
\(NWSE \) 隣接するグリッドにプッシュ、このグリッド内のすべての石を表す\(N \)は、トップを表し(Wが\)\左を表し、\(S \)は、以下に示される\(Eを\ )右を表します。
\(D \) すべての石は、グリッドを表す取ります。
所与の各動作シーケンスに対応する文字列、およびグリッド内の各グリッドに対応する動作のシーケンス、石からゲーム\(T \)秒後、石の数石までグリッド。ゲームが起動すると、グリッドが空です。

説明を入力します。

最初の行\(4 \)整数\(N、M、T、ACT \)
\(N- \)行、各行\(m個\)文字は、各グリッドに対応する動作のシーケンスを表します。
最後に\(ACT \)から表す文字列のライン(0 \)\各動作シーケンスが開始されます。

出力説明:

整数:ゲーム\(のt \)秒後に、すべてのグリッドの正方形どのように多くの石まで。

例1

エントリー

1 6 10 3
011 112
1E
E
0

輸出

3

説明

これは、他の同様のベルト構造です。左デバイス0は、東送信間隔と石を生成します。コンベヤベルト2、右端に3上に、5石の合計を生成し、2.10秒後に装置されるまで、右へ装置1を送信します。

問題の解決策

非常に困難なトピックを考えます。しかし、この問題は与えられていないに関係なく\(T \)高速電力ああを見て行列であるデータ範囲を、...
現在の行列は、一次元ベクトルとして書き込まれ、インペリアルれる\(F [0] = 1 \) 次いで\(i *が(M-1 )+ j個の\)は、元の位置を表している\((i、j)は、\ ) 石の数。
以下の動作シーケンス長ため\(6 \) および\(\ GCD(1,2,3,4,5,6)= 60 \)は、動作の各シーケンスが繰り返される(\ 60 \)回結局バック位置になります\(1 \) それすることができる(T \)\\(\ lfloorの\のFRACのT { 60} \ rfloor \) と\(T \ MOD 60 \)二つの部分。
構成\(C [POS]は\)を表し\(POS \)動作の伝達行列を。(ここで使用される\((i、j)は\ ) 座標を表し\((i、j)は\ ) 1つのベクトル内の位置)

  • 操作する際\(S [i]が\)デジタルであり、\(C [POS] [0、(I、J)] = S [I] \)、\ ((C [POS] [(I、J) i、j)が] = 1 \ )
  • また、動作\(S [I] = S 、E、W、N \) 、提供位置に移動(\(X、Y))を\ \ (C [POS] [(I、J)、( X、Y)= 1 \ )
  • また、動作\(S [I] = D \) 場合、\(C [POS] [(I、J)、(I、J)] = 0 \)

集合\(C = \ _のProd。1 = {I} ^ {60} C_I \)、\ (T = R&LT \ MOD 60 \) 次に答えが\(のF * C *との\のPROD _ {i = 1} ^ R C_R \)

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 110;

ll T;
int n, m, lim, len[N], act, now[10][10];
char s[10][10], t[10][10];

struct mat {
    ll a[65][65];
    mat() {memset(a, 0, sizeof(a));}
    mat operator * (mat &x) {
        mat ans;
        for(int i = 0; i <= lim; ++i) 
            for(int j = 0; j <= lim; ++j) 
                for(int k = 0; k <= lim; ++k) 
                    ans.a[i][j] += a[i][k] * x.a[k][j];
        return ans;
    }
    mat Pow(ll t, mat a) {
        mat ans; ans.a[0][0] = 1;
        while(t) {
            if(t & 1) ans = ans * a;
            a = a * a; t >>= 1;
        }
        return ans;
    }
}c[61], C;

int idx(int x, int y) {return (x - 1) * m + y;}

void print(mat x, bool flag) {
    puts("#####################");
    if(flag) {
        for(int i = 0; i <= lim; ++i) printf("%lld ", x.a[0][i]);
        puts("");
        return;
    }
    for(int i = 0; i <= lim; ++i) {
        printf("%d: ", i);
        for(int j = 0; j <= lim; ++j) {
            printf("%lld ", x.a[i][j]);
        }
        puts("");
    }
    puts("#####################");
}

int main() {
    scanf("%d%d%lld%d", &n, &m, &T, &act);
    lim = n * m;
    for(int i = 1; i <= n; ++i) {
        scanf("%s", t[i] + 1);
        for(int j = 1; j <= m; ++j) t[i][j] -= '0', ++t[i][j];
    }
    for(int i = 1; i <= act; ++i) {
        scanf("%s", s[i] + 1);
        len[i] = strlen(s[i] + 1);
    }
    for(int pos = 1; pos <= 60; ++pos) {
        c[pos].a[0][0] = 1;
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= m; ++j) {
//              putchar(s[t[i][j]][now[i][j]]);
                now[i][j] = (now[i][j] % len[t[i][j]]) + 1;
                if(s[t[i][j]][now[i][j]] >= '0' && s[t[i][j]][now[i][j]] <= '9') {
                    c[pos].a[0][idx(i, j)] = s[t[i][j]][now[i][j]] - '0';
                    c[pos].a[idx(i, j)][idx(i, j)] = 1;
                } else {
                    if(s[t[i][j]][now[i][j]] == 'D') c[pos].a[idx(i, j)][idx(i, j)] = 0;
                    if(i > 1 && s[t[i][j]][now[i][j]] == 'N') 
                        c[pos].a[idx(i, j)][idx(i - 1, j)] = 1;
                    if(i < n && s[t[i][j]][now[i][j]] == 'S') 
                        c[pos].a[idx(i, j)][idx(i + 1, j)] = 1;
                    if(j > 1 && s[t[i][j]][now[i][j]] == 'W') 
                        c[pos].a[idx(i, j)][idx(i, j - 1)] = 1;
                    if(j < m && s[t[i][j]][now[i][j]] == 'E') 
                        c[pos].a[idx(i, j)][idx(i, j + 1)] = 1;
                }
            }
        }
//        puts("");
    }
    C = c[1];
    for(int pos = 2; pos <= 60; ++pos) C = C * c[pos];
    C = C.Pow(T / 60, C);
    for(int pos = 1; pos <= T % 60; ++pos) {
//      printf("Round # %d\n", pos);
        C = C * c[pos];
//      print(c[pos], 0);
//      printf("The test # %d\n", pos);
//      print(C, 1);
    }
    ll ans = 0;
    for(int i = 1; i <= lim; ++i) ans = max(ans, C.a[0][i]);
    printf("%lld\n", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/henry-1202/p/11469114.html