순간을 성실히, 화려함보단 꾸준함을

[ boj : 20165] 인내의 도미노 장인 호석 본문

알고리즘,SQL/백준,BOJ

[ boj : 20165] 인내의 도미노 장인 호석

폭발토끼 2021. 1. 7. 20:24

www.acmicpc.net/problem/20165

 

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

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

www.acmicpc.net

문제 : 호석이가 도미노를 무너뜨린다. 이때 길이-1 만큼 넘어지고, 연다라 넘어진다. 넘어뜨린 후에는 한개의 도미노를 원상태로 만든다. 각 라운드마다 점수를 출력하고 보드의 상태를 출력해라

 

해설 : 뭐 해설이라고 할 것 없이 문제 그대로 구현만 침착하게 잘해주면 됩니다. 입력받은 보드를 직접적으로 사용하시게 되면 일관성이 깨져버리니 복사하여 그 복사한 보드를 가지고 열심히 동작시켜주면 됩니다.

 

#include<bits/stdc++.h>

using namespace std;

int n, m, r,sum=0;
int board[101][101], c_board[101][101];
int dx[] = { -1, 1, 0, 0 }, dy[] = { 0,0,-1,1 };

void copy_board();
void solve();
void go(int x, int y, int d);

int main()
{
	solve();
}
void solve()
{
	char t;
	int x, y,d;	
	cin >> n >> m >> r;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> board[i][j];
	copy_board();
	for (int i = 0; i < 2 * r; i++) {
		cin >> x >> y;
		if (!(i & 1)) {
			cin >> t;
			if (t == 'N')d = 0;
			else if (t == 'S')d = 1;
			else if (t == 'W')d = 2;
			else d = 3;
		}
		if (!(i & 1))
			go(x, y,d);
		else 
			c_board[x][y] = board[x][y];		
	}
	cout << sum << "\n";
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (c_board[i][j] > 0)cout << "S ";
			else cout << "F ";
		}
		cout << "\n";
	}
}
void copy_board()
{
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			c_board[i][j] = board[i][j];
}
void go(int x, int y, int d)
{
	if (x <= 0 || x > n || y <= 0 || y > m)return;
	if (c_board[x][y] == -1)return;

	int num = board[x][y];
	c_board[x][y] = -1;
	sum++;
	for (int i = 1; i <= num-1; i++) {
		go(x + dx[d] * i, y + dy[d] * i, d);
	}	
}