본문 바로가기
백준/그래프

백준 4963 c++ -[PlusUltraCode]

by PlusUltraCode 2024. 2. 26.

[필자 사고]

 

전형적인 그래프 탐색 문제이다.

 

다른 문제와 달리 특이한 점은 대각선의 이동경로 또한 탐색해야 된다는 점이다.

 

평소 접했던 문제는 동 서 남 북 총 4방향만 탐색경로로 지정 했다면 이 문제는 
대각선까지 고려해야 된다.


int dx[8] = {1,1,0,-1,-1,-1,0,1};
int dy[8] = { 0,1,1,1,0,-1,-1,-1, };

수학에서 배웠떤 1사분면 (1,0)에서 시작하여 반시계 방향으로 4사분면 (1,-1) 까지 이동경로를 넣어놓은 배열이다.

 

나머지는 BFS() 탐색으로 문제를 쉽게 풀 수 있다.

 

[소스 코드]

 

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

int dx[8] = {1,1,0,-1,-1,-1,0,1};
int dy[8] = { 0,1,1,1,0,-1,-1,-1, };
vector<vector<int>> Arr;
vector<vector<bool>> visited;

bool Inside(int seroSize, int garoSize, int sero,int garo) {
	if (sero >= 0 && sero < seroSize && garo >= 0 && garo < garoSize)return true;
	return false;
}

void BFS(int seroSize, int garoSize) {
	queue<pair<int, int>> myQueue;
	
	int count = 0;
	for (int y = 0; y < seroSize; y++) {
		for (int x = 0; x < garoSize; x++) {
			if (visited[y][x] == false && Arr[y][x] == 1) {
				count++;
				myQueue.push({ y,x });
				visited[y][x] = true;

				while (!myQueue.empty()) {
					int nowSero = myQueue.front().first;
					int nowGaro = myQueue.front().second;
					myQueue.pop();

					for (int i = 0; i < 8; i++) {
						int nextSero = nowSero + dy[i];
						int nextGaro = nowGaro + dx[i];
						if (Inside(seroSize, garoSize, nextSero, nextGaro) &&
							visited[nextSero][nextGaro] == false &&
							Arr[nextSero][nextGaro] == 1) {
							visited[nextSero][nextGaro] = true;
							myQueue.push({ nextSero,nextGaro });
						}
					}
				}
			}
		}
	}
	cout << count << '\n';
}

void Init(int sero, int garo) {
	Arr.clear();
	visited.clear();
	Arr.resize(sero);
	visited.resize(sero);
	for (int i = 0; i < sero; i++) {
		Arr[i].resize(garo);
		visited[i].resize(garo, false);
	}
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	while (1) {
		int garo, sero;
		cin >> garo >> sero;
		if (garo == 0 && sero == 0)return 0;
		Init(sero, garo);
		
		for (int i = 0; i < sero; i++) {
			for (int k = 0; k < garo; k++) {
				cin >> Arr[i][k];
			}
		}
		BFS(sero,garo);
	}
}

'백준 > 그래프' 카테고리의 다른 글

백준 1261 c++ -[PlusUltraCode]  (0) 2024.02.26
백준 1504 c++ - [PlusUltraCode]  (0) 2024.02.26
백준 13549 c++ -[PlusUltraCode]  (1) 2024.02.26
백준 2583 c++ -[PlusUltraCode]  (0) 2024.02.23
백준 2468 c++ - [PlusUltraCode]  (0) 2024.02.23