본문 바로가기

백준/다이나믹 프로그래밍

새로운 게임

728x90

www.acmicpc.net/problem/17780

 

17780번: 새로운 게임

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하

www.acmicpc.net

#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