어흥

[백준 3709] 레이저빔은 어디로 (C++) 본문

알고리즘/백준

[백준 3709] 레이저빔은 어디로 (C++)

라이언납시오 2020. 5. 25. 21:24
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/3709

 

3709번: 레이저빔은 어디로

문제 레이저박스라는 게임은 정사각형  모양의 n x n 보드에서 진행한다. (체스판을 상상하면 된다) 레이저박스의 임의의 칸마다 우향우 거울이라는 장치가 설치되어 있고, 마지막으로 레이저 ��

www.acmicpc.net

1. 주의할 점

- X,Y의 입력으로 받거나 Y,X 입력으로 받거나 둘중 하나로 통일해야 한다

 

2. 구현

- Num, Mirror의 수를 입력 받은 후, Arr[][]배열을 항상 0으로 초기화한다

- 우향우 거울인 경우, Arr[][] 배열값을 1로 설정한다

- 어떤 지점에서 레이저가 시작되는지에 따라 4가지의 초기값이 다른 DFS를 수행한다

- DFS()를 통해 범위 밖으로 나가는 경우, 해당 값을 출력하도록 한다

- 현재 칸이 거울인 경우, 오른쪽으로 90도 꺽고 이동한다

- 현재 칸이 거울이 아닌 경우, 원래 진행방향에 따라 이동한다

 

#include <iostream>
using namespace std;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
int arr[52][52], num, mirror;

void dfs(int y, int x, int dir) {
	if (y == 0 || x == 0 || y == num + 1 || x == num + 1) {
		cout << y << " " << x << '\n';
		return;
	}
	if (arr[y][x] == 1) {		//거울
		int nd = (dir + 1) % 4;
		dfs(y + dy[nd], x + dx[nd], nd);
	}
	else dfs(y + dy[dir], x + dx[dir], dir);
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int test, x, y, dir;
	cin >> test;
	for (int t = 0; t < test; t++) {
		cin >> num >> mirror;
		for (int i = 0; i < num + 2; i++)
			for (int j = 0; j < num + 2; j++)
				arr[i][j] = 0;
		for (int i = 0; i < mirror; i++) {
			cin >> y >> x;
			arr[y][x] = 1;
		}
		cin >> y >> x;
		if (y == 0) dfs(y + 1, x, 2);
		else if (y == num + 1) dfs(y - 1, x, 0);
		else if (x == 0) dfs(y, x + 1, 1);
		else if (x == num + 1) dfs(y, x - 1, 3);		
	}
	system("pause");
	return 0;
}
728x90
반응형

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

[백준 11085] 군사 이동 (C++)  (0) 2020.05.26
[백준 1956] 운동 (C++)  (0) 2020.05.25
[백준 17835] 면접보는 승범이네 (C++)  (0) 2020.05.24
[백준 2470] 두 용액 (C++)  (0) 2020.05.23
[백준 1981] 배열에서 이동 (C++)  (0) 2020.05.22
Comments