제출 #387520

#제출 시각아이디문제언어결과실행 시간메모리
387520mohamedsobhi777바이러스 (JOI19_virus)C++14
0 / 100
2090 ms4196 KiB
#include <bits/stdc++.h>

using namespace std;

#define vi vector<int>
#define vll vector<ll>
#define vii vector<pair<int, int>>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define loop(_) for (int __ = 0; __ < (_); ++__)
#define pb push_back
#define f first
#define s second
#define sz(_) ((int)_.size())
#define all(_) _.begin(), _.end()
#define lb lower_bound
#define ub upper_bound

using ll = long long;
using ld = long double;

const int N = 800 + 7;
const ll mod = 1e9 + 7;

int n, m, k, Min, Cnt;
int a[N][N], b[N][N];
int mov[100000 + 8];
string st;
int col;
int viz[N][N];
int m1[4] = {1, -1, 0, 0}, m2[4] = {0, 0, 1, -1};

bool chk(int A, int B)
{
       vi arr(k, 0);
       for (int j = 0; j < k; ++j)
       {
              int nx = A + m1[mov[j]];
              int ny = B + m2[mov[j]];
              if (nx < 0 || nx >= n || ny < 0 || ny >= m)
                     continue;
              if (viz[nx][ny])
                     arr[j] = 1;
       }
       int best = 0;
       int sum = 0;
       for (int i = 0; i < k; ++i)
       {
              if (!arr[i])
                     break;
              best++;
       }
       for (int i = k - 1; ~i; --i)
       {
              if (!arr[i])
                     break;
              best++;
       }

       for (int i = 0; i < k; ++i)
       {
              if (!arr[i])
              {
                     best = max(best, sum);
                     sum = 0;
              }
              else
                     ++sum;
       }
       best = max(best, sum);
       return best >= a[A][B];
}

int solve(int x, int y)
{
       ++col;
       queue<pii> qu;
       qu.push({x, y});
       int ret = 1;
       memset(viz, 0, sizeof viz);

       viz[x][y] = 1;

       while (sz(qu))
       {
              int A = qu.front().f;
              int B = qu.front().s;
              qu.pop();

              for (int j = 0; j < 4; ++j)
              {
                     int nx = A + m1[j];
                     int ny = B + m2[j];
                     if (nx >= 0 && nx < n && ny >= 0 && ny < m)
                     {
                            if (!viz[nx][ny] && a[nx][ny] != 0 && chk(nx, ny))
                            {
                                   qu.push({nx, ny});
                                   ++ret;
                                   viz[nx][ny] = 1;
                            }
                     }
              }
       }
       return ret;
}

int main()
{
       ios_base::sync_with_stdio(0);
       cin.tie(0);
#ifndef ONLINE_JUDGE
#endif
       cin >> k >> n >> m;
       cin >> st;
       for (int i = 0; i < k; ++i)
       {
              if (st[i] == 'S')
                     mov[i] = 0;
              else if (st[i] == 'N')
                     mov[i] = 1;
              else if (st[i] == 'W')
                     mov[i] = 3;
              else
                     mov[i] = 2;
       }
       for (int i = 0; i < n; ++i)
       {
              for (int j = 0; j < m; ++j)
              {
                     cin >> a[i][j];
              }
       }

       Min = 1e9;
       for (int i = 0; i < n; ++i)
       {
              for (int j = 0; j < m; ++j)
              {
                     if (!a[i][j])
                            continue;
                     int an = solve(i, j);
                     if (an < Min)
                     {
                            Min = an, Cnt = 1;
                     }
                     else if (an == Min)
                            ++Cnt;
              }
       }
       cout << Min << "\n";
       cout << Cnt << "\n";
       return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...