1 minute read

코드

#include <bits/stdc++.h>
#define X first
#define Y second

using namespace std;

int dx[4] = {0, 1, -1, 0};
int dy[4] = {1, 0, 0, -1};
int vis[1001][1001];
int ans[10];
int player[10];

class cord
{
public:
    int x, y, num;
    cord(int _x, int _y, int _num) : x(_x), y(_y), num(_num){};
};
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, m, p;
    cin >> n >> m >> p;
    queue<cord> q[10];
    for (int i = 1; i <= p; i++)
    {
        cin >> player[i];
    }
    char ch;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> ch;
            if (ch == '.')
            {
                vis[i][j] = 1;
            }
            else if (ch == '#')
            {
                vis[i][j] = 0;
            }
            else
            {
                vis[i][j] = 0;
                ans[ch - '0']++;
                q[ch - '0'].push(cord(i, j, 0));
            }
        }
    }

    while (1)
    {
        bool flag = 0;

        for (int i = 1; i <= p; i++)
        {
            queue<cord> nq;
            while (!q[i].empty())
            {
                auto cur = q[i].front();
                q[i].pop();
                if (cur.num >= player[i])
                {
                    nq.push(cord(cur.x, cur.y, 0));
                    continue;
                }
                for (int dir = 0; dir < 4; dir++)
                {
                    int nx = dx[dir] + cur.x;
                    int ny = dy[dir] + cur.y;
                    if (nx >= n || nx < 0 || ny >= m || ny < 0)
                        continue;
                    if (!vis[nx][ny])
                        continue;
                    q[i].push(cord(nx, ny, cur.num + 1));
                    vis[nx][ny] = 0;
                    ans[i]++;
                    flag = 1;
                }
            }
            q[i] = nq;
        }
        if (!flag)
            break;
    }
    for (int i = 1; i <= p; i++)
    {
        cout << ans[i] << " ";
    }
    return 0;
}

설명

지문에서 Si칸을 동시에 확장한다고 하는데 이 부분을 잘못 이해했다. 이동가능한 칸이니 이동 가능한 칸이 2칸이면

.....1....  
....111...  
...11111..   <- 가운데 1 기준
....111...  
.....1....  

이런식으로 확장한다는것을 이해 하여야 풀 수 있다..

Tags:

Categories:

Updated:

Leave a comment