드래곤 커브
https://www.acmicpc.net/problem/15685
<문제>
<코드>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <deque>
using namespace std;
int n, x, y, d, g; // 동 북 서 남 0 1 2 3
int map[101][101], visit[101][101];
struct location {
int x, y;
};
deque<location> q;
void initialMap(int arr[101][101])
{
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
arr[i][j] = 0;
}
void printMap(int arr[101][101])
{
printf("\n");
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
void make(int g)
{
int a, b, c, d, ans=0;
// 시작점
a = q.front().x;
b = q.front().y;
while (g--)
{
// 끝점
c = q.back().x;
d = q.back().y;
int nc, nd, tc, td;
for (int i = q.size() - 1; i >= 0; i--)
{
// 큐의 모든점들을 c,d를 기준으로 회전시켜준다.
nc = q[i].x;
nd = q[i].y;
tc = nc;
td = nd;
nc = td - d;
nd = c - tc;
nc += c;
nd += d;
// 회전한 점들을 큐에 넣고 map에다가도 표시
q.push_back({ nc,nd });
map[nc][nd] = 1;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
while (n--) {
cin >> y >> x >> d >> g;
// x는 행, y는 열로 사용하자. 받을때만 반대로 받기
map[x][y] = 1;
q.push_back({ x,y });
// 동북서남
if (d == 0)
{
map[x][y + 1] = 1;
q.push_back({ x,y + 1 });
}
else if (d == 1)
{
map[x - 1][y] = 1;
q.push_back({ x - 1,y });
}
else if (d == 2)
{
map[x][y - 1] = 1;
q.push_back({ x,y - 1 });
}
else
{
map[x + 1][y] = 1;
q.push_back({ x + 1,y });
}
make(g);
//printMap(map);
//initialMap(map);
q.clear();
}
int ans = 0;
// 네 꼭지점이 모두 드래곤 커브의 일부인 것의 개수 세기
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;
}
'Algorithm > 시뮬레이션' 카테고리의 다른 글
[백준][14503번][시뮬레이션] 로봇 청소기 (0) | 2019.05.04 |
---|---|
[백준][3568번][시뮬레이션] iSharp (0) | 2019.05.04 |