아무코딩

[백준 11967] 불켜기(c++) 본문

알고리즘/백준

[백준 11967] 불켜기(c++)

동 코 2020. 5. 30. 01:19

문제풀이

불이 켜진곳만 갈수 있고 불을 켜는 곳은 다른방이다. 

그래서 갔던 곳도 다시 가보면 갈 수 있는 곳이 늘었을 수도 있다.

 

그래서 bfs를 반복해서 돌려야된다. 언제까지 돌려야되냐면 count가 증가하지 않을 때 까지 돌려야 된다. 

 

불을 켜는 정보는 2차원으로 이루어진 vector로 구현된 adjacencyList 에 저장한다.

 

 

소스코드

더보기
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int mapSize, inputSize;
vector<pair<int,int>> adjList[101][101];
bool visited[101][101];
bool light[101][101];
int dirRow[4= {1,0,-1,0};
int dirCol[4= {0,-1,0,1};
int cnt=0;
queue<pair<int,int>> q;
void turnOnLight(int row, int col) {
    for(int i=0;i<adjList[row][col].size();i++){
        pair<int,int> nextRoom = adjList[row][col][i];
        if(!light[nextRoom.first][nextRoom.second]){
            //printf("%d,%d\n",nextRoom.first,nextRoom.second);
            light[nextRoom.first][nextRoom.second] = true;
            cnt++;
        }
    }
}
bool isRange(int row, int col){
    if(row<=0||col<=0||row>mapSize||col>mapSize)
        return false;
    return true;
}
static void initVisited() {
    for(int i=1;i<=mapSize;i++){
        for(int j=1;j<=mapSize;j++){
            visited[i][j] = false;
        }
    }
}
void bfs(){
    initVisited();
    visited[1][1]=true;
    q.push(make_pair(11));
    while(!q.empty()){
        int row = q.front().first;
        int col = q.front().second;
        q.pop();
        turnOnLight(row, col);
        for(int i=0;i<4;i++){
            int nextRow = row+dirRow[i];
            int nextCol = col+dirCol[i];
            
            if(isRange(nextRow, nextCol)&&light[nextRow][nextCol]&&!visited[nextRow][nextCol]){
                visited[nextRow][nextCol] = true;
                q.push(make_pair(nextRow,nextCol));
            }
        }
    }
    
}
int main() {
    scanf("%d %d",&mapSize,&inputSize);
    
    for(int i=0;i<inputSize;i++){
        int x,y,a,b;
        scanf("%d %d %d %d",&x,&y,&a,&b);
        adjList[x][y].push_back(make_pair(a,b));
    }
    
    cnt=1;
    light[1][1= true;
    int before_cnt = 0;
    do{
        before_cnt = cnt;
        bfs();
    }while(cnt!=before_cnt);
   
    
    printf("%d\n",cnt);
    return 0;
}
 
cs
 

문제 링크 : www.acmicpc.net/problem/11967

 

11967번: 불켜기

문제 농부 존은 최근에 N*N개의 방이 있는 거대한 헛간을 새로 지었다. 각 방은 (1, 1)부터 (N,N)까지 번호가 매겨져있다(2≤N≤100). 어둠을 무서워하는 암소 베시는 최대한 많은 방에 불을 밝히고 ��

www.acmicpc.net

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1938] 통나무 옮기기  (0) 2020.06.05
[백준 7432] 디스크 트리(java)  (0) 2020.06.04
[백준 2616] 소형기관차 (java)  (0) 2020.05.29
[백준 1987] 알파벳  (0) 2020.05.29
[백준 17471] 게리멘더링 (java,c++)  (0) 2020.05.28
Comments