https://www.acmicpc.net/problem/15685
15685번: 드래곤 커브
첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커
www.acmicpc.net
문제 이해
이걸 대체 어떻게 그림을 그려야하지 싶어서 바로 검색을 했다.
이 드래곤 커브는 패턴을 가지고 있다. 예를 들어 처음 방향이 0이면
- 0세대: 0
- 1세대: 0 1
- 2세대: 01 21
- 3세대: 0121 2321
- 4세대: 01212321 23032321
- ....
로 이어진다.
즉 1세대는 0세대 커브 + 0세대 커브를 역으로 읽으며 거기에 1을 더한 값이다 ( 0121 -> 2321 )
- 방향(d)와 세대(g)를 받아서 커브의 모양을 방향을 저장하는 배열 dir에 정리해주고, (Add_Direction())
- 시작점에서부터 그 방향을 따라가면서 map에 꼭짓점을 1로 표시해주면 된다. (Draw_Curve())
나는 디버깅을 편히 하려고 c라는 값을 대신 넣어주었다. - 마지막으로 맵을 탐색하면서 꼭짓점이 모두 4인 칸,
즉 (i,j) (i, j+1), (i+1, j), (i+1, j+1) 이 모두 4인 경우를 세주면 된다 (Count_Rects())
주의할 점
내가 맨날 헷갈리는 좌표....
입력으로 (X, Y) 가 주어지는데, X가 열이고 Y가 행인데, 입력을 X, Y순으로 받는다
작성 코드
#include <stdio.h>
#include <string.h>
#define SIZE 100
int N;
int map[SIZE + 5][SIZE + 5];
int dir[1024 + 5];
int d_size = 0;
int dy[] = { 0, -1, 0, 1 };
int dx[] = { 1, 0, -1, 0 };
void Add_Direction(void) {
int end = d_size;
for (int i = 0; i < end; i++) {
dir[end+(end-i-1)] = (dir[i] + 1) % 4;
}
d_size *= 2;
}
void Draw_Curve(int y, int x, int d, int g, int c) {
memset(dir, 0, sizeof(dir));
d_size = 1;
dir[0] = d;
int ny = y, nx = x;
map[y][x] = c;
for (int i = 0; i < g; i++) {
Add_Direction();
}
/*
for (int j = 0; j < d_size; j++) {
printf("%d ", dir[j]);
}
printf("\n");
*/
for (int i = 0; i < d_size; i++) {
ny += dy[dir[i]];
nx += dx[dir[i]];
map[ny][nx] = c;
}
}
int Count_Rects(void) {
int cnt = 0;
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
if (map[i][j] == 0) continue;
if (map[i][j + 1] == 0) continue;
if (map[i + 1][j] == 0) continue;
if (map[i + 1][j + 1] == 0) continue;
cnt++;
}
}
return cnt;
}
int main(void) {
int y, x, d, g;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d %d %d %d", &x, &y, &d, &g);
Draw_Curve(y, x, d, g, i+1);
}
printf("%d", Count_Rects());
return 0;
}
'컴퓨터기본 > 문제풀이' 카테고리의 다른 글
[백준] 15684번: 사다리 조작 (0) | 2021.11.24 |
---|---|
[백준] 14889번: 스타트와 링크 (0) | 2021.11.24 |
[백준] 15686번: 치킨 배달 (0) | 2021.11.22 |
[백준[ 16234번: 인구 이동 (0) | 2021.11.22 |
[백준] 16236번: 아기 상어 (0) | 2021.11.21 |