https://www.acmicpc.net/problem/15685
유형: 시뮬레이션
- 방향의 규칙성을 먼저 찾는다.
- 시작점에서 벡터의 정보대로 드레곤 커브를 완성한다
- map에 1로 업데이트 한다
- 주어진 입력값을 다 구한 다음 map에 1이 몇개 있는지 세어본다
가장 중요한 코드는 아래 코드 이다. 방향 벡터의 끝에서 부터 0까지 탐색한다.
for (int j = dir.size() - 1; j >= 0; j--)
{
dir.push_back((dir[j] + 1) % 4);
}
※ 전체코드
/*
0세대 동
1세대 동북
2세대 동북서북
3세대 동북서북서남서북
방향을 먼저 구한뒤 그것 대로 시작점에서 순서대로 한다
0동 1북 2서 3남
100*100 행렬에서 커브를 구한 뒤 1로 초기화
true의 1의 갯수를 찾는다
main
입력
처음 방향은 먼저 push
sol
세대수-1
while(세대수--)
for 끝에서 0까지
구한 벡터배열 대로 입력좌표에서 시작
*/
#include<iostream>
#include<vector>
using namespace std;
int N;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,-1,0,1 };
int map[101][101];
int ans;
void sol(int x,int y,int d,int g)
{
vector<int> dir;
dir.push_back(d);
for (int i = 0; i < g; i++)//세대수
{
for (int j = dir.size() - 1; j >= 0; j--)
{
dir.push_back((dir[j] + 1) % 4);
}
}
int ny = y;
int nx = x;
map[ny][nx] = 1;
for (int i = 0; i < dir.size(); i++)//1로 업데이트
{
ny += dy[dir[i]];
nx += dx[dir[i]];
map[ny][nx] = 1;
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++)
{
int x, y, d, g;
cin >> x >> y >> d >> g;
sol(x, y, d, g);
}
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
if (map[i][j] && map[i + 1][j] && map[i][j + 1] && map[i + 1][j + 1])
{
ans++;
}
}
}
cout << ans;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 16234 인구 이동 (0) | 2020.03.13 |
---|---|
백준 15686 치킨 배달 (0) | 2020.03.13 |
15684 사다리 조작 (0) | 2020.03.13 |
15683 감시 (0) | 2020.03.12 |
14891번 톱니바퀴 (0) | 2020.03.12 |