반응형
https://www.acmicpc.net/problem/20165
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();
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 10551번 : STROJOPIS (0) | 2021.08.03 |
---|---|
(C++) - 백준(BOJ) 9947번 : Coin tossing (0) | 2021.08.03 |
(C++) - 백준(BOJ) 17826번 : 나의 학점은? (0) | 2021.07.26 |
(C++) - 백준(BOJ) 21737번 : SMUPC 계산기 (0) | 2021.07.25 |
(C++) - 백준(BOJ) 3425번 : 고스택 (0) | 2021.07.05 |