일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- SW Expert Academy
- 감상문
- cs
- 데이터베이스
- db
- 네트워크
- algogritim
- c++
- Database
- 재테크/투자
- 자료구조
- swea
- network
- language
- 법의학
- 백준
- D2
- 운영체제
- OS
- 문제풀이
- 독서
- 프로그래머스
- LeetCode
- data structure
- algorithm
- Programmers
- BOJ
- 알고리즘
- Computer Science
- D3
Archives
- Today
- Total
선택은 나의 것
[BOJ 백준] 11967번 불켜기 본문
문제
BOJ 11967 : 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
접근
베시는 불이 켜진 방으로만 갈 수 있고 방에서 다른 방의 불을 켤 수 있다. 이를 BFS로 풀다 보면 문제가 생기는데 테스트 케이스를 예로 보면 (1, 1)에서 출발하여 (1, 2)와 (1, 3)의 불을 켤 수 있다. 다음으로 (1, 2)를 방문하고 (1, 3)을 방문한다. (1, 3)에서 (2, 1)의 불을 켠다. 이때 (2, 1)도 (1, 1)을 통해 갈 수 있는 방이지만 (1, 1)은 이미 BFS를 통해 방문을 마친 상태이기 때문에 방문하지 못한다. 따라서 일반적인 BFS의 코드로는 (2, 1)의 방에 방문해서 (2, 2)의 불을 켜지 못하므로 제대로 된 답을 찾을 수 없다. 그래서 이럴 경우 방문했던 좌표를 다시 방문해주는 코드를 기존의 BFS의 코드에 추가해주기만 하면 된다.
코드
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
int n, m, counter = 1, map[105][105], dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, 1, -1};
vector<pair<int,int>> v[105][105];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y, a, b;
cin >> x >> y >> a >> b;
v[x][y].push_back({a, b});
}
queue<pair<int,int>> q;
q.push({1, 1});
map[1][1] = 2;
while (!q.empty()){
pair<int, int> f = q.front();
q.pop();
for (auto p : v[f.first][f.second]) {
if (map[p.first][p.second])
continue;
for (int i = 0; i < 4; i++){
int newx = p.first + dx[i];
int newy = p.second + dy[i];
if (map[newx][newy] == 2) {
q.push({newx, newy});
break;
}
}
map[p.first][p.second] = 1;
counter++;
}
for (int i = 0; i < 4; i++){
int newx = f.first + dx[i];
int newy = f.second + dy[i];
if (map[newx][newy] == 1){
map[newx][newy] = 2;
q.push({newx,newy});
}
}
}
cout << counter;
return 0;
}
'☽ Algorithm > BOJ' 카테고리의 다른 글
[BOJ 백준] 10836번 여왕벌 서브태스크 (1) | 2021.12.15 |
---|---|
[BOJ 백준] 2174번 로봇 시뮬레이션 (0) | 2021.12.14 |
[BOJ 백준] 14466번 소가 길을 건너간 이유 6 (0) | 2021.12.11 |
[BOJ 백준] 16967번 배열 복원하기 (0) | 2021.12.09 |
[BOJ 백준] 17780번 새로운 게임 (0) | 2021.12.08 |
Comments