본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 20165번 : 인내의 도미노 장인 호석

반응형

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

 

20165번: 인내의 도미노 장인 호석

사람을 화나게 하는 법은 다양하다. 그 중에서도 악질은 바로 열심히 세워놓은 도미노를 넘어뜨리는 것이다. 이번에 출시된 보드 게임인 "너 죽고 나 살자 게임"은 바로 이 점을 이용해서 2명이

www.acmicpc.net

simulation, 구현 문제였습니다.

 

 

 

풀이방법

 1. 현재 게임판에 대한 입력을 적절이 받고 매 라운드별 입력을 받습니다.

 

 2. 공격의 행,열 좌표에 해당하는 도미노가 쓰러져있다면 아무일도 벌어지지 않습니다. 서 있다면 방향대로 쓰러뜨립니다. 판의 끝까지 순회하며 더 높은 높이가 있다면 지속적으로 갱신해주면서 도미노를 쓰러뜨립니다.

 

 3. 수비수의 입력 좌표에 해당하는 도미노를 세워줍니다.

 

 4. 라운드가 끝난 후 답을 출력합니다.

 

 

Code

#include <bits/stdc++.h>
using namespace std;
int n, m, r, score;
int board[101][101];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
char isFell[101][101];

int getDirection(char d){
    if(d == 'E') return 0;
    if(d == 'W') return 1;
    if(d == 'S') return 2;
    return 3;
}

void fallDownDomino(int startRow, int startCol, int dir) {
    int height = board[startRow][startCol];
    int nx = startRow;
    int ny = startCol;
    while(height){
        if(1 > nx || nx > n || 1 > ny || ny > m) break;
        if(isFell[nx][ny] == 'S'){
            isFell[nx][ny] = 'F';
            score++;
            height = max(height,board[nx][ny]);
        }
        nx += dx[dir];
        ny += dy[dir];
        height--;
    }
}

void print(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cout << isFell[i][j] << ' ';
        }
        cout << '\n';
    }
}

int main(){

    cin >> n >> m >> r;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> board[i][j];
            isFell[i][j] = 'S';
        }
    }

    while(r--){
        int offenseX,offenseY,defenseX,defenseY;
        char d;
        cin >> offenseX >> offenseY >> d;
        cin >> defenseX >> defenseY;
        int dir = getDirection(d);
        if(isFell[offenseX][offenseY] == 'S') fallDownDomino(offenseX, offenseY, dir);
        isFell[defenseX][defenseY] = 'S';
    }

    cout << score << '\n';
    print();
}