[BOJ][삼성기출] 14891. 톱니바퀴
풀이 (hard coding ver.)
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
#define N 0
#define S 1
#define CW 1
#define L 6
#define R 2
using namespace std;
int K, num, dir;
int map[4][8];
int new_map[4][8];
int roate_info[4][3] = { {1, 2, 3}, {0, 2, 3}, {2, 1, 0} };
int is_rotate[4];
void rotate(int num, int dir) {
is_rotate[num] = 1;
if (dir == CW) {
for (int i = 0; i <= 7; i++) new_map[num][(i + 1) % 8] = map[num][i];
} else {
for (int i = 0; i <= 7; i++) new_map[num][(i + 7) % 8] = map[num][i];
}
}
void update_map() {
for (int i = 0; i <= 3; i++) {
if (is_rotate[i]) {
for (int j = 0; j <= 7; j++) {
map[i][j] = new_map[i][j];
}
}
}
}
void slove(int num, int dir) {
rotate(num, dir);
if (num == 0) {
if (map[0][R] != map[1][L]) {
rotate(1, dir * -1);
if (map[1][R] != map[2][L]) {
rotate(2, dir);
if (map[2][R] != map[3][L]) {
rotate(3, dir * -1);
}
}
}
} else if (num == 1) {
if (map[1][L] != map[0][R]) {
rotate(0, dir * -1);
}
if (map[1][R] != map[2][L]) {
rotate(2, dir * -1);
if (map[2][R] != map[3][L]) {
rotate(3, dir);
}
}
} else if (num == 2) {
if (map[2][R] != map[3][L]) {
rotate(3, dir * -1);
}
if (map[2][L] != map[1][R]) {
rotate(1, dir * -1);
if (map[1][L] != map[0][R]) {
rotate(0, dir);
}
}
} else {
if (map[3][L] != map[2][R]) {
rotate(2, dir * -1);
if (map[2][L] != map[1][R]) {
rotate(1, dir);
if (map[1][L] != map[0][R]) {
rotate(0, dir * -1);
}
}
}
}
update_map();
}
void cal_rst() {
int sum = 0;
for (int i = 0; i < 4; i++) {
if (map[i][0] == S) sum += pow(2, i);
}
cout << sum << endl;
}
int main() {
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 7; j++) {
scanf("%1d", &map[i][j]);
}
}
cin >> K;
for (int k = 0; k < K; k++) {
cin >> num >> dir;
memset(is_rotate, 0, sizeof(is_rotate));
memset(new_map, 0, sizeof(new_map));
slove(num - 1, dir);
}
cal_rst();
}
히히 너무 무식하게 풀었오ㅠ
풀이 (dfs ver.)
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
#define N 0
#define S 1
#define CW 1
using namespace std;
int K, num, dir;
int map[4][8];
int new_map[4][8];
int is_rotate[4];
void rotate(int num, int dir) {
if (dir == CW) {
for (int i = 0; i <= 7; i++) new_map[num][(i + 1) % 8] = map[num][i];
} else {
for (int i = 0; i <= 7; i++) new_map[num][(i + 7) % 8] = map[num][i];
}
}
void update_map() {
for (int i = 0; i <= 3; i++) {
if (is_rotate[i]) {
for (int j = 0; j <= 7; j++) map[i][j] = new_map[i][j];
}
}
}
void dfs(int num, int dir) {
is_rotate[num] = 1;
rotate(num, dir);
if (!is_rotate[num - 1] && num - 1 >= 0) {
if (map[num][6] != map[num - 1][2]) dfs(num - 1, dir * -1);
}
if (!is_rotate[num + 1] && num + 1 <= 3) {
if (map[num][2] != map[num + 1][6]) dfs(num + 1, dir * -1);
}
}
void cal_rst() {
int sum = 0;
for (int i = 0; i < 4; i++) {
if (map[i][0] == S) sum += pow(2, i);
}
cout << sum << endl;
}
int main() {
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 7; j++) {
scanf("%1d", &map[i][j]);
}
}
cin >> K;
for (int k = 0; k < K; k++) {
cin >> num >> dir;
memset(is_rotate, 0, sizeof(is_rotate));
memset(new_map, 0, sizeof(new_map));
dfs(num - 1, dir);
update_map();
}
cal_rst();
}
다시 풀이
Author And Source
이 문제에 관하여([BOJ][삼성기출] 14891. 톱니바퀴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kyoung99u/BOJ-14891-톱니바퀴저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)