[1012] 유기농 배추

!·2022년 7월 4일
0

BFS/DFS

목록 보기
7/17

내 코드

#include <iostream>
#include <queue>
#include <utility>
using namespace std;

int field[51][51];
int xdis[4] = {1,0,-1,0};
int ydis[4] = {0,1,0,-1};
bool isvisit[51][51];

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t; cin >> t;
    while(t--)
    {
        int ans = 0;
        queue<pair<int,int>> q;
        int m,n,k; cin >> m >> n >> k;
        for(int i = 0;i<m;i++)
        {
            for(int j =0;j<n;j++)
            {
                field[i][j] = 0;
                isvisit[i][j] = false;
            }
        }
        int i,j;
        while(k--)
        {
            cin >> i >> j;
            field[i][j] = 1;
        }
            for(int a = 0;a<m;a++)
            {
                for(int b = 0;b<n;b++)
                {
                    if(isvisit[a][b] == true || field[a][b] == 0) continue;
                    ans++;
                    isvisit[a][b] = true;
                    q.push({a,b});
                    while(!q.empty())
                    {
                        pair<int,int> p = q.front(); q.pop();
                        for(int i = 0;i<4;i++)
                        {
                            int curx = p.first + xdis[i];
                            int cury = p.second + ydis[i];
                            if(curx < 0 || curx >= m || cury <0 || cury >= n) continue;
                            if(isvisit[curx][cury] || field[curx][cury] == 0) continue;
                            q.push({curx,cury});
                            isvisit[curx][cury] = true;
                        }
                    }
                 }
              }
        cout << ans << '\n';
    }
    return 0;
}
  • 진짜 엄청 틀렸다. 아무리 찾아보고 찾아봐도 오류인 점이 없는데 계속 통과를 못했다..
  • 알고보니 좌표축 실수더라.. 전에 bfs 문제들 에서도 몇번 실수한 적이 있는데 이렇게 스노우볼이 될줄 몰랐다..
  • 자격이 있는 모든 출발점에 대해 bfs 를 수행하면 된다.

정답코드는 유사해서 생략하겠습니다.

profile
개발자 지망생

0개의 댓글