BOJ 15685 : 드래곤 커브 - C++
드래곤 커브
코드
#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <deque>
#include <numeric>
#include <map>
#define ll long long
using namespace std;
int K,ans;
int dx[4] = {1, 0, -1, 0}; // 동, 북, 서, 남
int dy[4] = {0, -1, 0, 1};
vector<pair<pair<int,int>,int>> v[20]; // 좌표, 뒤 좌표를 향하는 방향
map<pair<int,int>,bool> m;
int changeDIR(int d){
d--;
if(d<0) d+=4;
return d;
}
int reverseDIR(int d){
d += 2;
if(d>3) d-=4;
return d;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> K;
for(int i=0;i<K;i++)
{
int x,y,d,g;
cin >> x >> y >> d >> g;
v[i].push_back({{y,x},d});
// 0세대까지는 만들어주기
if(g >= 0){
int ny = y + dy[d];
int nx = x + dx[d];
int nd = reverseDIR(d);
v[i].push_back({{ny,nx},-1});
v[i][0].second = nd;
}
// 해당 세대 좌표 만들기
for(int j=1;j<=g;j++)
{
int pre = v[i].size()-1;
int tmp = v[i].size();
for(int st=tmp-2;st>=0;st--)
{
int dir = changeDIR(v[i][st].second);
int ny = v[i][pre].first.first + dy[dir];
int nx = v[i][pre].first.second + dx[dir];
v[i].push_back({{ny,nx},-1});
v[i][pre].second = reverseDIR(dir);
pre++;
}
}
// 좌표평면에 그리기
for(int j=0;j<v[i].size();j++)
{
auto cur = v[i][j];
m[{cur.first.first, cur.first.second}] = true;
}
}
// 사각형 검사
for(int i=0;i<=100;i++)
for(int j=0;j<=100;j++)
if(m[{i,j}] and m[{i+1,j}] and m[{i,j+1}] and m[{i+1,j+1}]) ans++;
cout << ans;
return 0;
}
드래곤 커브
의 세대 증가
로직
드래곤 커브
의 가장 마지막 점 인덱스
를 pre
에 저장
마지막 점을 제외한 나머지 점
에 대해서 방향정보(dir)
를 가져온다
(방향 정보
: 내 다음 점
이 나를 보는 방향
)
가져온 방향 정보
를 90도 회전
시킨 후 pre
를 통해 새로운 ny, nx
를 구한다
새로 구한 점
을 삽입
하고, pre에 해당하는 점
은 방향정보
가 새로 생겼으니 추가
해준다
pre++
로 다시 새로운 끝점
을 가리키게
한다
앞 순서
를 반복!
- 느낀 점
auto 변수
로 변수
를 받는 경우
읽을수는 있지만
, 쓸 수는 없다
(값 복사
)
끝 점을 제외한 나머지 점
을 당시 마지막 좌표를 기준
으로 90도 회전
시키는게 핵심
Author And Source
이 문제에 관하여(BOJ 15685 : 드래곤 커브 - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@neity16/BOJ-15685-드래곤-커브-C
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <cstdio> #include <vector> #include <queue> #include <iostream> #include <cmath> #include <algorithm> #include <set> #include <deque> #include <numeric> #include <map> #define ll long long using namespace std; int K,ans; int dx[4] = {1, 0, -1, 0}; // 동, 북, 서, 남 int dy[4] = {0, -1, 0, 1}; vector<pair<pair<int,int>,int>> v[20]; // 좌표, 뒤 좌표를 향하는 방향 map<pair<int,int>,bool> m; int changeDIR(int d){ d--; if(d<0) d+=4; return d; } int reverseDIR(int d){ d += 2; if(d>3) d-=4; return d; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> K; for(int i=0;i<K;i++) { int x,y,d,g; cin >> x >> y >> d >> g; v[i].push_back({{y,x},d}); // 0세대까지는 만들어주기 if(g >= 0){ int ny = y + dy[d]; int nx = x + dx[d]; int nd = reverseDIR(d); v[i].push_back({{ny,nx},-1}); v[i][0].second = nd; } // 해당 세대 좌표 만들기 for(int j=1;j<=g;j++) { int pre = v[i].size()-1; int tmp = v[i].size(); for(int st=tmp-2;st>=0;st--) { int dir = changeDIR(v[i][st].second); int ny = v[i][pre].first.first + dy[dir]; int nx = v[i][pre].first.second + dx[dir]; v[i].push_back({{ny,nx},-1}); v[i][pre].second = reverseDIR(dir); pre++; } } // 좌표평면에 그리기 for(int j=0;j<v[i].size();j++) { auto cur = v[i][j]; m[{cur.first.first, cur.first.second}] = true; } } // 사각형 검사 for(int i=0;i<=100;i++) for(int j=0;j<=100;j++) if(m[{i,j}] and m[{i+1,j}] and m[{i,j+1}] and m[{i+1,j+1}]) ans++; cout << ans; return 0; }
드래곤 커브
의세대 증가
로직
드래곤 커브
의가장 마지막 점 인덱스
를pre
에 저장마지막 점을 제외한 나머지 점
에 대해서방향정보(dir)
를 가져온다
(방향 정보
:내 다음 점
이나를 보는 방향
)가져온 방향 정보
를90도 회전
시킨 후pre
를 통해 새로운ny, nx
를 구한다새로 구한 점
을삽입
하고,pre에 해당하는 점
은방향정보
가 새로 생겼으니추가
해준다pre++
로 다시새로운 끝점
을가리키게
한다앞 순서
를반복!
- 느낀 점
auto 변수
로변수
를받는 경우
읽을수는 있지만
,쓸 수는 없다
(값 복사
)끝 점을 제외한 나머지 점
을당시 마지막 좌표를 기준
으로90도 회전
시키는게핵심
Author And Source
이 문제에 관하여(BOJ 15685 : 드래곤 커브 - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@neity16/BOJ-15685-드래곤-커브-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)