본문 바로가기
CS/알고리즘

백준 17837 새로운 게임2

by zieunee 2020. 3. 5.
반응형

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

 

17837번: 새로운 게임 2

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

www.acmicpc.net

 

 

 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;
int N, K, map[15][15][15],color[15][15];
int dx[5] = { 0,0,0,-1,1 };
int dy[5] = { 0,1,-1,0,0 };
int chess[15][4];
int flag = 0;

void solve(int x, int y, int dir,int num) {
    int blueflag = 0;

    //맨 끝에 있을 때 >> 방향 바꿔주어야 한다. 
    if (x + dx[dir] <= 0 || y + dy[dir] <= 0 || x + dx[dir] > N || y + dy[dir] > N) {
        if (dir == 1 || dir == 3)  dir = dir + 1;
        else if (dir == 2 || dir == 4)  dir = dir - 1;
        chess[num][2] = dir;
        blueflag = 1;
    }
    
    int nextColor = color[x + dx[dir]][y + dy[dir]];
    //방향 별로 기능 수행 

    if (nextColor == 0) { //W
        int nx = x + dx[dir];
        int ny = y + dy[dir];
        
        //내 위에 있는 체스는 함께 움직임 (map[x][y][현재 움직일 체스 위치] ~~[맨 마지'막(제일 위에 있는) 체스위치 ])
        int mapsize = map[x][y][0];
        int mapstart = chess[num][3];
        for (int i = mapstart; i <= mapsize; i++) {
            ++map[nx][ny][0]; // 이동 
            --map[x][y][0]; //원래 있던 자리 갯수 제거
            chess[map[x][y][i]][3] = map[nx][ny][0];    //움직일 자리에 체스가 있다면 그 위로 올라감 
            chess[map[x][y][i]][0] = nx; chess[map[x][y][i]][1] = ny; //x,y값 변경 
            map[nx][ny][map[nx][ny][0]] = map[x][y][i]; //이동할 체스 원래있던애 위에 올리기
            map[x][y][i] = 0; // 원래있던 체스 초기화

            if (map[nx][ny][0] >= 4) flag = 1;
        }

    }
    else if (nextColor == 1) { //R
        int nx = x + dx[dir];
        int ny = y + dy[dir];


        //내 위에 있는 체스는 함께 움직임 (map[x][y][현재 움직일 체스 위치] ~~[맨 마지막(제일 위에 있는) 체스위치 ])
        int mapsize = map[x][y][0];
        int mapstart = chess[num][3];
        for (int i = mapsize; i >= mapstart; i--) {
            ++map[nx][ny][0]; // 이동 
            --map[x][y][0]; //원래 있던 자리 갯수 제거
            chess[map[x][y][i]][3] = map[nx][ny][0];    //움직일 자리에 체스가 있다면 그 위로 올라가는 번째  
            chess[map[x][y][i]][0] = nx; chess[map[x][y][i]][1] = ny; //x,y값 변경 
            map[nx][ny][map[nx][ny][0]] = map[x][y][i]; //이동할 체스 원래있던애 위에 올리기
            map[x][y][i] = 0; // 원래있던 체스 초기화

            if (map[nx][ny][0] >= 4) flag = 1;
        }


    }
    else if (nextColor == 2 && blueflag == 0) { //B
        if (dir == 1 || dir == 3)  dir = dir + 1;
        else if (dir == 2 || dir == 4)  dir = dir - 1;
      
        chess[num][2] = dir; // blue > 방향 바꿈 
       
        int nx = x + dx[dir];
        int ny = y + dy[dir];

        //방향 바꿔서도 파란색이면 >> 방향바꾼채로 앞으로 가지 말기 
        if (color[nx][ny] == 0 && nx > 0 && ny > 0 && nx <= N && ny <= N) {
            //내 위에 있는 체스는 함께 움직임 (map[x][y][현재 움직일 체스 위치] ~~[맨 마지막(제일 위에 있는) 체스위치 ])
            int mapsize = map[x][y][0];
            int mapstart = chess[num][3];
            for (int i = mapstart; i <= mapsize; i++) {
                ++map[nx][ny][0]; // 이동 
                --map[x][y][0]; //원래 있던 자리 갯수 제거
                chess[map[x][y][i]][3] = map[nx][ny][0];    //움직일 자리에 체스가 있다면 그 위로 올라감 
                chess[map[x][y][i]][0] = nx; chess[map[x][y][i]][1] = ny; //x,y값 변경 
                map[nx][ny][map[nx][ny][0]] = map[x][y][i]; //이동할 체스 원래있던애 위에 올리기
                map[x][y][i] = 0; // 원래있던 체스 초기화

                if (map[nx][ny][0] >= 4) flag = 1;
            }
        }
        else if (color[nx][ny] == 1 && nx > 0 && ny > 0 && nx <= N && ny <= N) {
            //내 위에 있는 체스는 함께 움직임 (map[x][y][현재 움직일 체스 위치] ~~[맨 마지막(제일 위에 있는) 체스위치 ])
            int mapsize = map[x][y][0];
            int mapstart = chess[num][3];
            for (int i = mapsize; i >= mapstart; i--) {
                ++map[nx][ny][0]; // 이동 
                --map[x][y][0]; //원래 있던 자리 갯수 제거
                chess[map[x][y][i]][3] = map[nx][ny][0];    //움직일 자리에 체스가 있다면 그 위로 올라가는 번째  
                chess[map[x][y][i]][0] = nx; chess[map[x][y][i]][1] = ny; //x,y값 변경 
                map[nx][ny][map[nx][ny][0]] = map[x][y][i]; //이동할 체스 원래있던애 위에 올리기
                map[x][y][i] = 0; // 원래있던 체스 초기화

                if (map[nx][ny][0] >= 4) flag = 1;
            }

        }


    }
}
int main() {
	scanf("%d%d", &N, &K);

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf("%d", &color[i][j]);
		}
	}

	for (int i = 1; i <= K; i++) {
		scanf("%d%d%d", &chess[i][0], &chess[i][1], &chess[i][2]);
		map[chess[i][0]][chess[i][1]][1] = i;
		chess[i][3] = 1; // 몇번째 위치하는지  
		map[chess[i][0]][chess[i][1]][0] = 1; //같은 칸에 말이 두 개 이상 있는 경우는 입력으로 주어지지 않는다.
	}


    int res = 1;

    while (1) {

  
        for (int i = 1; i <= K; i++) {
            solve(chess[i][0], chess[i][1], chess[i][2], i);
            if (flag == 1) {
                break;
            }
        }
        
        if (flag == 1) {
            printf("%d", res);
            break;
        }else if (res > 1000) {
            printf("-1");
            break;
        }
        res++;
    }

}
반응형

'CS > 알고리즘' 카테고리의 다른 글

백준 17143 낚시왕(시뮬)  (0) 2020.05.06
백준 16236 아기상어(bfs)  (0) 2020.05.06
백준 17779 게리맨더링2  (0) 2020.03.04
백준 13460 구슬탈출2  (0) 2020.02.15
백준 1986 체스  (0) 2020.02.11