BOJ:2012有機白菜(C++)


質問する



Code

#include <iostream>
#include <queue>
#include <utility>

using namespace std;
#define X first
#define Y second
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int T;
    cin >> T;

    while(T--)
    {
        int M, N, K, num=0;
        int board[52][52];
        int vis[52][52];
        /* 입력 시작 */
        cin >> M >> N >> K;  // M : x / N : y
        for(int i=0;i < M;i++)
        {
            fill(board[i],board[i]+M,0);
            fill(vis[i],vis[i]+M,0);
        }
        for(int i=0;i<K;i++)
        {
            pair<int,int> tmp;
            cin >> tmp.X >> tmp.Y;
            board[tmp.X][tmp.Y] = 1;
        }

        for(int i=0;i<M;i++)
        {
            for(int j=0;j<N;j++)
            {
                if(vis[i][j] || board[i][j] != 1) continue;
                num++;
                queue<pair<int,int>> Q;
                Q.push({i,j});
                vis[i][j] = 1;
                while(!Q.empty())
                {
                    auto cur = Q.front(); Q.pop();
                    for(int dir=0;dir<4;dir++)
                    {
                        int nx = cur.X + dx[dir];
                        int ny = cur.Y + dy[dir];
                        if(nx < 0 || nx >= M || ny<0 || ny>= N) continue;
                        if(vis[nx][ny] || board[nx][ny] != 1) continue;
                        vis[nx][ny] = 1;
                        Q.push({nx, ny});
                    }
                }
            }
        }
        cout << num <<'\n';
    }
}
  • 難易度
  • 題で白菜畑の横長=M
                                 縦の長さ=N
    N*M配列で近いですが、正反対です.
    (?なんで?知ってたら教えて)