0으로 주어진 모든 점에 대해 4방향 탐색 시뮬레이션을 구현하면 된다.
다만, 처음에 재귀로 풀었는데 런타임 에러가 났다. 맵이 100x100인 경우에 함수 호출이 많아 스택이 터지는거 같다.
그래서 꼭 반복문으로 풀어야 하는듯 하다.
#include <stdio.h> #include <algorithm> using namespace std; struct Worm { int x, y, data; Worm() { x = 0, y = 0, data = 0; } Worm(int x,int y,int d):x(x),y(y), data(d) {} }; int t, n, res; int map[100][100]; Worm worm[10]; int wormIdx; int dx[] = { -1,1,0,0 }; int dy[] = { 0,0,-1,1 }; //0상, 1하, 2좌, 3우 int run(int x, int y, int dir) { int cnt = 0; int sx = x; int sy = y; int ax = x + dx[dir]; int ay = y + dy[dir]; int d = dir; while (true) { //printf("(%d, %d) %d\n", ax, ay, d); //벽에 부딪힌 경우 if (ax < 0 || ay < 0 || ax >= n || ay >= n) { int odir; if (d == 0) odir = 1; else if (d == 1) odir = 0; else if (d == 2) odir = 3; else odir = 2; ax = ax + dx[odir]; ay = ay + dy[odir]; d = odir; cnt++; continue; } //종료 if (map[ax][ay] == -1 || (ax == sx && ay == sy)) { return cnt; } //빈칸인 경우 if (map[ax][ay] == 0) { ax = ax + dx[d]; ay = ay + dy[d]; } //블록인 경우 else if (1 <= map[ax][ay] && map[ax][ay] <= 5) { int odir; if (map[ax][ay] == 1) { if (d == 0) odir = 1; else if (d == 1) odir = 3; else if (d == 2) odir = 0; else odir = 2; } else if (map[ax][ay] == 2) { if (d == 0) odir = 3; else if (d == 1) odir = 0; else if (d == 2) odir = 1; else odir = 2; } else if (map[ax][ay] == 3) { if (d == 0) odir = 2; else if (d == 1) odir = 0; else if (d == 2) odir = 3; else odir = 1; } else if (map[ax][ay] == 4) { if (d == 0) odir = 1; else if (d == 1) odir = 2; else if (d == 2) odir = 3; else odir = 0; } else { if (d == 0) odir = 1; else if (d == 1) odir = 0; else if (d == 2) odir = 3; else odir = 2; } ax = ax + dx[odir]; ay = ay + dy[odir]; d = odir; cnt++; } //웜홀인 경우 else if (6 <= map[ax][ay] && map[ax][ay] <= 10) { for (int i = 0; i < wormIdx; i++) { if (map[ax][ay] == worm[i].data) { if (worm[i].x != ax || worm[i].y != ay) { ax = worm[i].x + dx[d]; ay = worm[i].y + dy[d]; break; } } } } } } int main() { scanf("%d", &t); for (int tc = 1; tc <= t; tc++) { scanf("%d", &n); wormIdx = 0; res = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &map[i][j]); if (6 <= map[i][j] && map[i][j] <= 10) { Worm w(i, j, map[i][j]); worm[wormIdx++] = w; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (map[i][j] == 0) { for (int k = 0; k < 4; k++) { //printf("(%d, %d) 에서 %d 방향\n", i, j, k); res = max(run(i, j, k), res); } } } } printf("#%d %d\n", tc, res); } }
'SWEA::문제풀이' 카테고리의 다른 글
5648 원자 소멸 시뮬레이션 (0) | 2018.10.08 |
---|---|
5644 무선 충전 (0) | 2018.10.08 |
공통조상 (0) | 2018.09.06 |
균형점 (0) | 2018.09.06 |
최대 상금 (0) | 2018.09.06 |