[알고리즘] 문제풀이 연습

[백준] 15685 드래곤커브 : 시뮬레이션

ddgoori 2019. 11. 15. 02:40

https://www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다. (0 ≤ x, y ≤ 100, 0 ≤ d ≤ 3, 0 ≤ g ≤ 10) 입력으로 주어지는 드래곤 커브는 격자 밖으로 벗어나지 않는다. 드래곤 커브는 서로 겹칠 수 있다. 방향은 0, 1, 2,

www.acmicpc.net

// 드래곤 커브

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool map[102][102];

//끝점의 정보
int end_x = 0;
int end_y = 0;

//왼쪽, 위쪽, 오른쪽, 아래쪽
int dx[] = { 0, -1, 0, 1 };
int dy[] = { 1, 0 ,-1, 0 };

//스택으로 사용할 드래곤 모양 벡터 만들기
vector<int> dragon;

//스택을 조사하면서 드래곤 커브를 만드는 함수
void make_generation(vector<int> &dragon) {

	//현재 스택의 크기를 먼저 계산
	int size = (int)dragon.size();

	//스택의 뒤에서부터 꺼내면서 
	//다음세대의 방향정보를 dir = (dragon[i]+1)%4 규칙으로 생성
	for (int i = size - 1; i >= 0; i--) {
		int dir = (dragon[i] + 1) % 4; //드래곤 뒤부터(스택이니깐)

		//다음 세대 방향 정보를 바탕으로 다음 x, y를 찾고 이를 갱신
		end_x = end_x + dx[dir];
		end_y = end_y + dy[dir];

		//만들어진 드래곤 커브를 지도에 넣는다
		map[end_x][end_y] = true;


		//다음세대를 위한 스택에 방향정보를 넣어준다.
		dragon.push_back(dir);
	}
}

int main() {
	
	int n;
	cin >> n;

	for (int i = 0; i < n; i++) {
		
		//x,y순서 바꿔서 입력
		int y, x, d, g;
		cin >> y >> x >> d >> g;

		//기존드래곤 커브의 스택을 비워준다.
		dragon.clear();

		//끝점을 갱신한다
		end_x = x;
		end_y = y;

		//현재 위치에 드래곤 커브가 놓여있으므로 지도에 표시해준다.
		map[end_x][end_y] = true;

		//0세대는 미리 만들어 놓는다.
		end_x = x + dx[d];
		end_y = y + dy[d];

		//0세대를 만든 후 지도에 표시해준다.
		map[end_x][end_y] = true;

		//0세대의 방향정보를 스택에 넣어준다.
		dragon.push_back(d);
		
		//반복문을 통해 0부터 차례대로 드래곤 커브를 만들면서 g까지 만든다

		for (int i = 0; i < g; i++) {
			make_generation(dragon);
		}
	
	}

	//정답찾기 100*100 2차원 행렬 2중 for문으로 단순 탐색 인접한 4칸이 모두 ture이면 커브의 일부
	int answer = 0;
	for (int i = 0; i <= 100; i++) {
		for (int j = 0; j <= 100; j++) {
			
			if (map[i][j] && map[i][j + 1] && map[i + 1][j] && map[i + 1][j + 1])
				answer++;

		}
	}

	cout << answer << endl;
}

 

출처 도움: https://m.blog.naver.com/godori91/221256904654