https://www.acmicpc.net/problem/15685
코드:
#include <iostream>
#include <cmath>
#include <vector>
#define fastio() ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr);
using namespace std;
int N;
int map[222][222];
int dy[4] = {0, -1, 0, 1};
int dx[4] = {1, 0, -1, 0};
vector<int> way[4];
void draw(int y, int x, int d, int c, int g) {
if (c == g) return;
map[y][x] = 1;
draw(y + dy[way[d][c]], x + dx[way[d][c]], d, c + 1, g);
}
int main() {
fastio();
cin >> N;
for (int i = 0; i < 4; i++) {
way[i].push_back(i); way[i].push_back((i + 1) % 4);
}
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= 1024; j *= 2) {
for (int k = 0; k < j; k++) {
way[i].push_back((way[i][k] + 2) % 4);
}
for (int k = j; k < j + j; k++) {
way[i].push_back(way[i][k]);
}
}
}
int a, b, c, d;
for (int i = 0; i < N; i++) {
cin >> a >> b >> c >> d;
draw(111 + b, 111 + a, c, 0, pow(2, d) + 1);
}
int cnt = 0;
for (int i = 0; i < 222; i++) {
for (int j = 0; j < 222; j++) {
if (map[i][j] and map[i][j + 1] and map[i + 1][j] and map[i + 1][j + 1]) cnt++;
}
}
cout << cnt;
}
|
cs |
문제요약:
특이한 규칙으로 나아가는 dfs를 방문한다. 그리고 어떠한 점의 아래 오른쪽 대각선을 방문 한 다면 count++해서 count를 출력한다
생각의 흐름:
드래곤 커브가 나아가는데 일정한 규칙이 있다 ->
n세대의 드래곤 커브는 총 2^n + 1개 만큼 방문한다 ->
직접 방향을 그려 본다->
n세대의 드래곤 커브는 0부터 2^(n - 1)개의 방향을 뒤집고,
2^(n - 1)부터 2^n개까지의 방향을 그대로 가져온다 ->
for (int i = 0; i < 4; i++) {
way[i].push_back(i); way[i].push_back((i + 1) % 4);
}
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= 1024; j *= 2) {
for (int k = 0; k < j; k++) {
way[i].push_back((way[i][k] + 2) % 4);
}
for (int k = j; k < j + j; k++) {
way[i].push_back(way[i][k]);
}
}
}
|
cs |
코드
->그래프를 dfs하고 개수를 센다.
'백준(C, C++) > 골드' 카테고리의 다른 글
백준 7450: Bin Packing [C/C++] (0) | 2022.06.07 |
---|---|
백준 2357 최솟값과 최댓값 c++ (0) | 2022.06.02 |
백준 11505 구간 곱 구하기 (0) | 2022.06.02 |
세그먼트 트리 기초: 백준 2042 구간 합 구하기 [C/C++] (0) | 2022.05.27 |
[C/C++] 백준 14500번 - 테트로미노, 삼성 코딩 테스트 문제를 두 가지 방법으로 풀어보자 (0) | 2022.05.25 |