Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- SWEA
- 우분투
- 자료구조 목차
- 윈도우
- 백준
- c#
- 3344
- 마우스 따라다니기
- 2020 KAKAO BLIND RECRUITMENT
- 알고리즘
- MySQL
- 유니티
- 탄막 스킬 범위
- 문자열 압축
- 3273
- 그리디알고리즘
- 토글 그룹
- 회의실 배정
- 탄막
- 원형
- 수 만들기
- 18249
- 강의실2
- 걷는건귀찮아
- 탄막 이동
- AI Hub
- 단어 수학
- 영상 프레임 추출
- 알고리즘 목차
- mysqld.sock
Archives
- Today
- Total
와이유스토리
[시뮬레이션(회전)] (CHECK) 백준 20057 마법사 상어와 토네이도 C++ 본문
https://www.acmicpc.net/problem/20057
#include <iostream>
using namespace std;
int n;
int A[500][500];
float wind[4][5][5] = { { {0, 0, 0.02, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0.05, 0, 0, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0, 0, 0.02, 0, 0} } , { {0, 0, 0.02, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0.05, 0.75, 0, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0, 0, 0.02, 0, 0} } , { {0, 0, 0.02, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0.05, 0.75, 0, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0, 0, 0.02, 0, 0} } , { {0, 0, 0.02, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0.05, 0.75, 0, 0, 0}, {0, 0.1, 0.07, 0.01, 0}, {0, 0, 0.02, 0, 0} } };
int dx[4] = { -1, 0, 1, 0 }; // 좌하우상
int dy[4] = { 0, 1, 0, -1 };
void rotate() { // 반시계 회전
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) wind[1][i][j] = wind[0][j][4-i]; // 왼쪽 90도 회전
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) wind[2][i][j] = wind[0][4-i][4-j]; // 180도 회전
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) wind[3][i][j] = wind[0][4-j][i]; // 오른쪽 90도 회전
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(); cout.tie();
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) cin >> A[i][j];
}
rotate();
int cursorX = n / 2; // 현재 위치
int cursorY = n / 2;
int sand = 0; // 현재 위치 모래 양
int count = 1; // 위치 이동 칸 수
int answer = 0; // 격자 바깥 모래 양
while (true) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < count; j++) {
cursorX = cursorX + dx[i];
cursorY = cursorY + dy[i];
sand = A[cursorY][cursorX];
// 모래 이동
for (int p = cursorY - 2; p <= cursorY + 2; p++) {
for (int q = cursorX - 2; q <= cursorX + 2; q++) {
int blow = sand * wind[i][p - (cursorY - 2)][q - (cursorX - 2)];
A[cursorY][cursorX] -= blow;
if ((p < 0) || (q < 0) || (p >= n) || (q >= n)) answer += blow; // 격자 바깥
else A[p][q] += blow;
}
}
// 알파
int aX = cursorX + dx[i];
int aY = cursorY + dy[i];
if ((aX < 0) || (aY < 0) || (aX >= n) || (aY >= n)) answer += A[cursorY][cursorX]; // 격자 바깥
else A[aY][aX] += A[cursorY][cursorX];
A[cursorY][cursorX] = 0;
// 토네이도 소멸
if ((cursorX == 0) && (cursorY == 0)) {
cout << answer;
return 0;
}
}
if ((i == 1) || (i == 3)) count++;
}
}
return 0;
}
'코딩테스트 > 시뮬레이션' 카테고리의 다른 글
[시뮬레이션(테트리스)] (CHECK) 백준 20061 모노미노도미노2 C++ (0) | 2023.10.01 |
---|---|
[시뮬레이션] 백준 14890 경사로 C++ (0) | 2023.09.04 |
[시뮬레이션] 프로그래머스 퍼즐 조각 채우기 C++ (0) | 2023.03.28 |
[시뮬레이션(회전)] (CHECK) 프로그래머스 자물쇠와 열쇠 C++ (0) | 2023.02.19 |
[시뮬레이션] 프로그래머스 [1차] 프렌즈4블록 C++ (0) | 2022.03.03 |
Comments