백준 17780 새로운 게임
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 17780 새로운 게임

by KyeongMin 2019. 11. 14.
728x90
반응형

https://www.acmicpc.net/problem/17780

 

17780번: 새로운 게임

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하나의 말 위에 다른 말을 올릴 수 있다. 체스판의 각 칸은 흰색, 빨간색, 파란색 중 하나로 색칠되어있다. 게임은 체스판 위에 말 K개를 놓고 시작한다. 말은 1번부터 K번까지 번호가 매겨져 있고, 이동 방향도 미리 정해져 있다. 이동 방향은 위, 아래, 왼쪽, 오른쪽

www.acmicpc.net

#include<stdio.h>
#include<vector>
using namespace std;
#define NS 13
#define KS 11
int input[NS][NS];
int N, K;
int dy[] = { 0,0,0,-1,1 };//우,좌,상,하
int dx[] = { 0,1,-1,0,0 };
struct Data {
	int y,x,dir,num;
};
vector<Data>horse[KS];
vector<Data>hInput[NS][NS];
int Time = 0;
void wSpace(Data c,Data n) {
	while (!hInput[c.y][c.x].empty()) {
		Data h = hInput[c.y][c.x].front(); hInput[c.y][c.x].erase(hInput[c.y][c.x].begin());
		hInput[n.y][n.x].push_back({ n.y,n.x,h.dir,h.num });
		horse[h.num].front().y = n.y;
		horse[h.num].front().x = n.x;
		horse[h.num].front().dir = h.dir;
		horse[h.num].front().num = h.num;
	}
}
void rSpace(Data c, Data n) {
	while (!hInput[c.y][c.x].empty()) {
		Data h = hInput[c.y][c.x].back(); hInput[c.y][c.x].pop_back();
		hInput[n.y][n.x].push_back({ n.y,n.x,h.dir,h.num });
		horse[h.num].front().y = n.y;
		horse[h.num].front().x = n.x;
		horse[h.num].front().dir = h.dir;
		horse[h.num].front().num = h.num;
	}
}
void bSpace(Data c, Data n) {
	if (hInput[c.y][c.x].front().dir == 1)hInput[c.y][c.x].front().dir = 2;
	else if (hInput[c.y][c.x].front().dir == 2)hInput[c.y][c.x].front().dir = 1;
	else if (hInput[c.y][c.x].front().dir == 3)hInput[c.y][c.x].front().dir = 4;
	else if (hInput[c.y][c.x].front().dir == 4)hInput[c.y][c.x].front().dir = 3;
	n.y = c.y + dy[hInput[c.y][c.x].front().dir];
	n.x = c.x + dx[hInput[c.y][c.x].front().dir];
	//파란공간인경우
	if (input[n.y][n.x] == 2 || (n.y<1 || n.y>N || n.x<1 || n.x>N)) {
		return;
	}
	//하얀공간인경우 
	else if (input[n.y][n.x] == 0) {
		wSpace(c, n);
	}
	//빨간공간인경우
	else if (input[n.y][n.x] == 1) {
		rSpace(c, n);
	}
}
void play() {
	while (1) {
		int cnt = 0;//턴 확인 용도
		Time++;
		for (int i = 1; i <= K; i++) {
			Data c = horse[i].front();
			if (hInput[c.y][c.x][0].num != i)continue;// 하단이 아니면 
			int dir=hInput[c.y][c.x][0].dir;
			Data n;
			n.y = c.y + dy[dir];
			n.x = c.x + dx[dir];
			//파란공간이거나 벗어나는경우 
			if (input[n.y][n.x] == 2 || (n.y<1||n.y>N||n.x<1||n.x>N)) {
				bSpace(c,n);
			}
			//하얀공간인경우 
			else if(input[n.y][n.x]==0){
				wSpace(c,n);
			}
			//빨간공간인경우//
			else if (input[n.y][n.x] == 1) {
				rSpace(c,n);
			}
		
		}
		//탈출 조건
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if (hInput[i][j].size() >= 4) {
					printf("%d\n", Time);
					return;
				}
			}
		}
		if (Time == 1001) {
			printf("-1\n");
			return;
		}
	}
}
void init() {
	scanf("%d %d", &N, &K);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf("%d", &input[i][j]);
		}
	}
	for (int i = 1; i <= K; i++) {
		int y, x, dir;
		scanf("%d %d %d", &y, &x, &dir);
		horse[i].push_back({ y,x,dir});//위치 바로 확인위한 용도
		hInput[y][x].push_back({ 0,0,dir,i });//여러개있는경우 위치
	}
	play();
}
int main(void) {
	init();
	return 0;
}

이문제는 정말 하라는대로 짜기만하면 풀리는 문제여서 진짜 쉬웠습니다. 백터를 사용할줄 알아서 쉽게 느껴졌을수 있지만 많이 어려운 문제는 아니였습니다. 여러분들도 한번에 짜려고하지말고 계획을 세우고 하다보시면 금방

구현하실 수 있습니다.

728x90
반응형

댓글