어흥
[백준 3709] 레이저빔은 어디로 (C++) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/3709
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