728x90
#include<iostream>
#include<vector>
using namespace std;
struct horse
{
int x, y, d;
bool is_bottom;
} h[10];
int N, K;
int dx[] = { 0, 0, 0, -1, 1 };
int dy[] = { 0, 1, -1, 0, 0 };
int turn[] = { 0, 2, 1, 4, 3 };
int color[13][13];
vector<int> info[13][13];
int move(int i)
{
int tx = h[i].x + dx[h[i].d];
int ty = h[i].y + dy[h[i].d];
// 2. 경계를 넘거나 파란 칸
if (tx <= 0 || ty <= 0 || tx > N || ty > N || color[tx][ty] == 2)
{
// 방향 전환
h[i].d = turn[h[i].d];
tx = h[i].x + dx[h[i].d];
ty = h[i].y + dy[h[i].d];
// 반대 방향도 파랑
if (tx <= 0 || ty <= 0 || tx > N || ty > N || color[tx][ty] == 2)
return 0;
}
vector<int> &cur = info[h[i].x][h[i].y];
vector<int> &next = info[tx][ty];
// 3. 하얀 칸
if (color[tx][ty] == 0)
{
if (!next.empty()) h[cur.front()].is_bottom = false; //기존칸의 맨앞은 더이상 젤 아래에 있는 게 아님
next.insert(next.end(), cur.begin(), cur.end());
}
// 4. 빨간 칸
else if (color[tx][ty] == 1)
{
next.insert(next.end(), cur.rbegin(), cur.rend());
h[next.back()].is_bottom = false; //is_bottom만 바꿔주면 reverse가 됨
h[next.front()].is_bottom = true;
}
h[next.front()].x = h[next.back()].x = tx; //가장 앞 혹은 가장 뒤에 있는 것만 좌표를 올바르게 설정해주면됨
h[next.front()].y = h[next.back()].y = ty;
cur.clear();
return next.size();
}
int simulation()
{
int round, i, tx, ty, stack_cnt;
// 라운드 반복
for (round = 1; round <= 1000; ++round)
{
// 1. 자기 차레에 가장 아래에 있다면 이동
for (i = 0; i < K; ++i)
{
if (h[i].is_bottom)
{
stack_cnt = move(i);
// 5. 말이 4 이상 쌓이면 종료
if (stack_cnt >= 4)
return round;
}
}
}
return -1;
}
int main()
{
cin >> N >> K;
int i, j;
for (i = 1; i <= N; ++i)
for (j = 1; j <= N; ++j)
cin >> color[i][j];
for (i = 0; i < K; ++i)
{
horse& ho = h[i];
cin >> ho.x >> ho.y >> ho.d;
ho.is_bottom = true;
info[ho.x][ho.y].push_back(i);
}
cout << simulation();
return 0;
}
- 구조체 배열로 선언 하는 방법에 대해서 알게됨
- 아래에 있는 말을 기준으로 이동과 reverse , 방향 변환이 일어난다 , 따라서 이동할 때 horse구조체의 x와 y 좌표 갱신을 맨 앞에있는것(front) 와 맨뒤에 있는 (end) 만 해준다. 대신 info 안에 좌표에 있는 horse list는 이동할 때마다 갱신을 해주어야함.
- horse의 번호 순으로 simulation을 하면 쉽게 풀 수 있다.
'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글
사회망 서비스 / Tree DP (0) | 2021.04.24 |
---|---|
LCS (0) | 2021.04.23 |
기타리스트 (0) | 2021.02.21 |
뮤탈리스크 (0) | 2021.02.19 |
평범한 배낭 (0) | 2021.02.17 |