タイトル説明
一件のゲーム石で\(\ 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;
}