드래곤 커브
본문 바로가기
알고리즘 모음집/New 알고리즘

드래곤 커브

by KyeongMin 2020. 10. 13.
728x90
반응형

www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커�

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
#define NS 101//배열 최대 크기
int N;//배열의 크기
int ret;//결과 값
int map[NS][NS];//드래곤 커브 확인 배열
int dy[] = { 0,-1,0,1 };
int dx[] = { 1,0,-1,0 };
struct Data {
	int y, x, dir, gen;//좌표, 방향, 세대
};
vector<Data>dragon;
void init_input(){//초기화 및 초기 입력
	//초기화
	N = ret = 0;
	memset(map, 0, sizeof(map));
	dragon.clear();
	//초기 입력
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		Data c;
		scanf("%d %d %d %d", &c.x, &c.y, &c.dir, &c.gen);
		dragon.push_back(c);//드래곤 정보 저장
	}
}
void dragonLevel() {//드래곤 커브 입력
	for (int i = 0; i < dragon.size(); i++) {
		//1. 드래곤 세대 경로 저장
		vector<int>dragonD;//드래곤 세대 저장
		dragonD.push_back(dragon[i].dir);
		for (int g = 1; g<=dragon[i].gen; g++) {
			for (int D = dragonD.size() - 1; D >= 0; D--) {
				dragonD.push_back((dragonD[D]+1) % 4);//경로 저장
			}
		}
		//2. 드래곤 세대 경로 배열 저장
		int y = dragon[i].y; int x = dragon[i].x;
		for (int di = 0; di < dragonD.size(); di++) {
			map[y][x] = 1;
			Data n; n.y = y + dy[dragonD[di]]; n.x = x + dx[dragonD[di]];
			map[n.y][n.x] = 1;
			y = n.y; x = n.x;
		}
	}
	//3. 확인
	for (int i = 0; i < 101; i++) {
		for (int j = 0; j < 101; j++) {
			if (map[i][j] == 1 && map[i][j + 1] == 1 && map[i + 1][j] == 1 && map[i + 1][j + 1] == 1) {
				ret++;
			}
		}
	}
}
int main(void) {
	int T = 1;//테스트 케이스
	//scanf("%d", &T);
	for (int tc = 1; tc <= T; tc++) {
		init_input();//초기화 및 초기 입력
		dragonLevel();//드래곤 성장
		//출력
		//printf("#%d %d\n", tc, ret);
		printf("%d\n", ret);
	}
	return 0;
}

 

경로를 뒤에서 부터 90도 시계방향으로 저장을하고 다시 배열에 경로를 입히면 빠르게 구현 할 수 있습니다.

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

아기상어  (0) 2020.10.13
  (0) 2020.10.13
연구소 2  (0) 2020.10.12
원판 돌리기  (0) 2020.10.12
사다리 조작  (0) 2020.10.11

댓글