이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#define taskname "Nautilus"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 510 * 510;
int r, c, m;
bitset<maxn> dp[5010], le, ri, lle, rri;
inline int cal(int x, int y) {return (x-1) * c + y;}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin>>r>>c>>m;
char cc;
for (int i=1; i<=r; i++) for (int j=1; j<=c; j++)
{
cin>>cc;
int id = cal(i, j);
if (cc == '.') dp[0].set(id), le.set(id), ri.set(id);
if (j == 1) le.reset(id), lle.set(id);
if (j == m) ri.reset(id), rri.set(id);
}
for (int i=1; i<=m; i++)
{
cin>>cc;
if (cc == 'N') dp[i] = dp[i-1] >> c;
else if (cc == 'S') dp[i] = dp[i-1] << c;
else if (cc == 'W')
{
bitset<maxn> tmp = dp[i-1] & le;
dp[i] = (tmp >> 1);
}
else if (cc == 'E')
{
bitset<maxn> tmp = dp[i-1] << 1;
dp[i] = tmp & le;
}
else
{
dp[i] = (dp[i-1] >> c) | (dp[i-1] << c);
bitset<maxn> tmp = dp[i-1] << 1;
dp[i] |= (tmp & le);
tmp = dp[i-1] & le;
dp[i] |= (tmp >> 1);
// dp[i] |= ((dp[i-1] >> 1) & ri) | ((dp[i-1] << 1) & le);
}
dp[i] &= dp[0];
// cerr<<i<<" "<<dp[i].count()<<" "<<dp[0].count()<<"\n";
}
cout<<dp[m].count();
}
/**
5 9 7
...##....
..#.##..#
..#....##
.##...#..
....#....
ES?EE??
**/
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |