반응형

https://www.acmicpc.net/problem/11967

 

11967번: 불켜기

(1, 1)방에 있는 스위치로 (1, 2)방과 (1, 3)방의 불을 켤 수 있다. 그리고 (1, 3)으로 걸어가서 (2, 1)방의 불을 켤 수 있다. (2, 1)방에서는 다시 (2, 2)방의 불을 켤 수 있다. (2, 3)방은 어두워서 갈 수 없으

www.acmicpc.net

 

각 방을 지날 때마다 불을 켤 수 있는 방들을 모두 켜줍니다.

만약, 이번에 새롭게 불을 켜는 방의 상하좌우에 있는 방 중에서,

이미 방문했던 방이 있다면 그 방을 다시 큐에 넣어서 지금 불은 켠 방을 재탐색할 수 있도록 해줍니다.

 

#include <iostream>
#include <vector>
#include <queue>
#define MAX 102
using namespace std;

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

int n, m;
bool map[MAX][MAX], visit[MAX][MAX];
vector<pair<int, int>> sw[MAX][MAX];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int x, y, a, b;
		cin >> x >> y >> a >> b;
		sw[x][y].push_back({ a, b });
	}

	int cnt = 1;
	queue<pair<int, int>> q;
	q.push({ 1, 1 });
	map[1][1] = visit[1][1] = true;
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();

		for (auto& p : sw[x][y]) {
			if (map[p.first][p.second]) continue;
			map[p.first][p.second] = true;
			for (int i = 0; i < 4; i++) {
				int nx = p.first + dx[i];
				int ny = p.second + dy[i];
				if (visit[nx][ny]) q.push({ nx, ny });
			}
			cnt++;
		}

		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (visit[nx][ny] || !map[nx][ny]) continue;
			q.push({ nx, ny });
			visit[nx][ny] = true;
		}
	}
	cout << cnt;
}
반응형

'Algorithm' 카테고리의 다른 글

백준 2638 : 치즈  (0) 2021.11.13
백준 4485 : 녹색 옷 입은 애가 젤다지?  (0) 2021.11.13
백준 10422 : 괄호  (0) 2021.11.13
백준 15661 : 링크와 스타트  (0) 2021.11.12
백준 15685 : 드래곤 커브  (0) 2021.11.12

+ Recent posts