-
[백준 20057] 마법사 상어와 토네이도C 프로그래밍/BOJ 2022. 10. 10. 15:35728x90
https://www.acmicpc.net/problem/20057
#include <cstdio> int N; int A[499 + 2][499 + 2]; int R[499 + 2][499 + 2]; // debug int percent[9] = { 1, 1, 2, 7, 7, 2, 10, 10, 5}; int lookup[4][2][10] = { // 1 1 2 7 7 2 10 10 5 a // 좌 {{-1, 1, -2, -1, 1, 2, -1, 1, 0, 0}, {1, 1, 0, 0, 0, 0, -1, -1, -2, -1}}, // 하 {{-1, -1, 0, 0, 0, 0, 1, 1, 2, 1}, {-1, 1, -2, -1, 1, 2, -1, 1, 0, 0}}, // 우 {{-1, 1, -2, -1, 1, 2, -1, 1, 0, 0}, {-1, -1, 0, 0, 0, 0, 1, 1, 2, 1}}, // 상 {{1, 1, 0, 0, 0, 0, -1, -1, -2, -1}, {-1, 1, -2, -1, 1, 2, -1, 1, 0, 0}} }; // 좌 하 우 상 int dir_x[4] = { 0, 1, 0, -1 }; int dir_y[4] = { -1, 0, 1, 0 }; void input() { scanf("%d", &N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &A[i][j]); } } } int blow_sand(int dir, int x, int y) { x += dir_x[dir]; y += dir_y[dir]; int before = A[x][y]; int tmp_sum = 0; int out_bound = 0; for (int p = 0; p < 9; p++) { int nx = x + lookup[dir][0][p]; int ny = y + lookup[dir][1][p]; int sand = before * percent[p] / 100; //printf("%d] %d %d %d\n",p, nx, ny, sand); if (nx < 0 || nx > N - 1 || ny < 0 || ny > N - 1) out_bound += sand; else A[nx][ny] += sand; tmp_sum += sand; } int ax = x + lookup[dir][0][9]; int ay = y + lookup[dir][1][9]; if (ax < 0 || ax > N - 1 || ay < 0 || ay > N - 1) out_bound += before - tmp_sum; else A[ax][ay] += before - tmp_sum; A[x][y] = 0; //printf("(%d %d) %d %d %d %d\n",ax, ay , A[ax][ay], before, tmp_sum, out_bound); //debug(); return out_bound; } int simulation() { int total = 0; int x = N / 2, y = N / 2, p = 0; for (int i = 1; i <= N; i++) { for (int d = 0; d < 2; d++) { // N - 1 까지해서 루프 한번 더 쓰지 말고 그냥 N일때는 d == 1에서 끊어주기 if (i == N && d == 1) break; for (int j = 1; j <= i; j++) { total += blow_sand(p, x, y); x += dir_x[p]; y += dir_y[p]; } p = (p + 1) % 4; } } return total; } int main() { input(); int ans = simulation(); printf("%d\n", ans); return 0; }
룩업테이블 실수하지 말자고...
각 좌표의 패턴을 파악할 것
++ 22.10.28 기존에 짰던 코드랑 로직은 100% 동일한데, 코드가 더 깔끔하게 나와서 갱신해본다. ㅎㅎ
실수했던 점은 보는 x -> y로 갈 때 바라보는 방향을 y기준으로 하면 안되고, x 기준으로 해야한다는 점이었다.
그래서 x += dir_x[p], y += dir_y[p]; 이런식으로 좌표 갱신해주기 전에 blow_sand 함수로 보내서 해당 x칸에서 바라보는 방향 p를 기준으로 모래 날려주고, 다시 돌아와서 이동해야 한다.
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 17144] 미세먼지 안녕! (0) 2022.10.10 [백준 17779] 게리맨더링 2 (0) 2022.10.10 [백준 20056] 마법사 상어와 파이어볼 (0) 2022.10.10 [백준 17837] 새로운 게임 2 (0) 2022.10.10 [백준 19237] 어른 상어 (0) 2022.10.10