#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//freopen("test36.in", "r", stdin);
//freopen("test01.out", "w", stdout);
int r, c, m;
cin >> r >> c >> m;
string a[r], s;
for (int i = 0; i < r; i++)
cin >> a[i];
cin >> s;
// sea[i]: mặt nạ ô nước của hàng i (1 = nước, 0 = đảo)
// reach[i]: các cột có thể đứng ở hàng i hiện tại
// tmp[i]: tạm dùng khi ký tự là ?
bitset<500> sea[r], reach[r], tmp[r];
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++) // đảo cột j -> c - 1 - j khi gán vào bitset
// nếu không đảo, hướng trái/phải sẽ bị ngược trực giác khi dùng shift
sea[i][j] = reach[i][j] = (a[i][c - 1 - j] == '.');
for (char c: s) {
if (c == 'W') {
for (int i = 0; i < r; ++i)
reach[i] = (reach[i] << 1) & sea[i];
}
if (c == 'E') {
for (int i = 0; i < r; ++i)
reach[i] = (reach[i] >> 1) & sea[i];
}
if (c == 'N') {
// để vào ô hàng i trước đó phải ở hàng i + 1
// duyệt i từ nhỏ đến lớn nên reach[i + 1] chưa bị ghi đè => đảm bảo dùng trạng thái cũ
for (int i = 0; i < r; ++i)
if (i + 1 < r)
reach[i] = reach[i + 1] & sea[i];
else
reach[i].reset(); // hàng cuối cùng i = r - 1 không thể đến được
}
if (c == 'S') {
// để vào ô hàng i trước đó phải ở hàng i - 1
// duyệt i từ lớn đến nhỏ nên reach[i - 1] chưa bị ghi đè => đảm bảo dùng trạng thái cũ
for (int i = r - 1; i >= 0; i--)
if (i > 0)
reach[i] = reach[i - 1] & sea[i];
else
reach[i].reset(); // hàng trên cùng i = 0 không thể đến được
}
if (c == '?') { // bất kỳ hướng
for (int i = 0; i < r; i++) {
// dùng mảng tmp để tính, vì còn dùng trạng thái cũ
tmp[i] = (reach[i] << 1) | (reach[i] >> 1); // hướng W, E
if (i > 0) tmp[i] |= reach[i - 1]; // hướng S
if (i + 1 < r) tmp[i] |= reach[i + 1]; // hướng N
tmp[i] &= sea[i];
}
for (int i = 0; i < r; i++)
reach[i] = tmp[i];
}
}
int ans = 0;
for (int i = 0; i < r; i++)
ans += reach[i].count();
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |