https://www.acmicpc.net/problem/15685
// 드래곤 커브
#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;
}
'[알고리즘] 문제풀이 연습' 카테고리의 다른 글
[DFS] 개념이해 및 Programmers lv.2 타겟넘버 (자료구조) (0) | 2021.03.19 |
---|---|
알고리즘 스터디 (0) | 2021.03.05 |
[프로그래머스] 주식가격 : level 2 (0) | 2019.11.05 |
[프로그래머스] p와 y찾기 : level 1 (0) | 2019.11.05 |
[프로그래머스] 소수찾기 : level 1 (에라토스테네스의 체) (0) | 2019.11.05 |