시작하는 칸을 큐에넣고 방문했다는 표시를 남김
큐에서 원소를 꺼내고, 그 칸에 상하좌우로 인접한 칸에 대해 3번을 진행
3-1. 해당 칸을 처음 방문한다면 => 방문했다는 표시를 남기고, 해당 칸을 큐에 삽입
3-2. 이전에 이미 방문한 칸이라면 => 아무것도 하지 않음
큐가 빌 때까지 2번을 반복
좌표 표현
헤더 < utility >
값 할당방법 : make_pair 로 값을 넣어줄수도 있고, 그냥 중괄호를 써서 값을 할당도 가능
알아서 앞쪽의 first 값을 먼저 비교후, 뒤쪽의 값을 비교
#include <bits/stdc++.h>
using namespace std;
int main(void){
pair<int, int> t1 = make_pair(10,13);
pair<int, int> t2 = {4,6};
cout << t1.first << ' ' << t2.second << '\n';
}
#include <bits/stdc++.h>
using namespace std;
// 1이면 데이터가 있는 칸, 0이면 없는 칸
int board[502][502] = {
{1,1,1,0,1,0,0,0,0,0},
{1,0,0,0,1,0,0,0,0,0},
{1,1,1,0,1,0,0,0,0,0},
{1,1,0,0,1,0,0,0,0,0},
{0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
bool visited[502][502];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
int n = 7, m = 10;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
queue<pair<int, int>> Q;
// BFS 탐색을 시작하는 칸을 (0,0)으로 잡았다.
// 좌표 (0,0) 을 방문 처리하고, 큐에 push
visited[0][0] = 1;
Q.push({ 0,0 });
// 큐가 빌 때까지 그 칸의 상하좌우의 칸을 추가하는것을 반복
while (!Q.empty())
{
pair<int, int> cur = Q.front();
Q.pop();
cout << '(' << cur.first << ", " << cur.second << ") -> ";
for (int i = 0; i < 4; i++) {
int nx = cur.first + dx[i]; // 상하좌우 칸에 대한 좌표 데이터 저장
int ny = cur.second + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
if (visited[nx][ny] || board[nx][ny] != 1)
continue;
visited[nx][ny] = 1; // 방문 처리하고 상하좌우 칸을 큐에 push
Q.push({ nx,ny });
}