N

(백준 c++)17837 새로운 게임 2 본문

백준 알고리즘

(백준 c++)17837 새로운 게임 2

naeunchan 2021. 4. 20. 21:23
728x90
반응형

www.acmicpc.net/problem/17837

 

17837번: 새로운 게임 2

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

www.acmicpc.net

 

 

구현 및 시뮬레이션 문제.

 

주요 변수 및 함수 설명/

board : 0, 1, 2 가 담겨있는 보드

play : 말이 움직이는 공간. string 형태로 말의 순서를 바꾸기 쉽게 한다.

player : 1부터 K까지 말의 좌표(x, y)와 방향(d)이 인덱스로는 0 ~ K - 1 로 담겨있다.

directReverse() : 벽을 넘어가거나 파란 블럭을 만났을 때 말의 방향을 바꾼다.

move() : player 벡터에 담긴 말이 움직인 좌표를 업데이트

blue() : 벽을 넘어가거나 파란 블럭을 만났을 때 말의 움직임 처리

movePlayer() : 말이 벽을 넘지 않았을 때 움직임 처리

 

 

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <string>
#include <algorithm>

using namespace std;

vector<vector<int>> board(13, vector<int>(13, 0));
string play[13][13];
vector<pair<pair<int, int>, int>> player;
int N, K, ans = 1;
int directX[5] = {0, 0, 0, -1, 1};
int directY[5] = {0, 1, -1, 0, 0};

int directReverse(int d){
    if(d == 1){
        return 2;
    }
    else if(d == 2){
        return 1;
    }
    else if(d == 3){
        return 4;
    }
    else{
        return 3;
    }
}

void move(string current, int nx, int ny){
    for(int i = 0; i < current.size(); i++){
        int playerNum = current[i] - '0';
        player[playerNum].first.first = nx;
        player[playerNum].first.second = ny;
    }
    play[nx][ny] += current;
}

bool blue(int x, int y, int d, string current, int i){
    d = directReverse(d);

    int nx = x + directX[d];
    int ny = y + directY[d];
    
    if(nx > 0 && nx <= N && ny > 0 && ny <= N){
        if(board[nx][ny] == 0){
            move(current, nx, ny);
        }
        else if(board[nx][ny] == 1){
            reverse(current.begin(), current.end());
            move(current, nx, ny);
        }
        else{
            play[x][y] += current;
            nx = x;
            ny = y;
        }
    }
    else{
        play[x][y] += current;
        nx = x;
        ny = y;
    }
    
    player[i].second = d;
    
    if(play[nx][ny].size() >= 4){
    	return true;
    }
    else{
    	return false;
    }
}

bool movePlayer(int x, int y, int d, string current, int nx, int ny, int i){
    if(board[nx][ny] == 0){
        move(current, nx, ny);
    }
    else if(board[nx][ny] == 1){
        reverse(current.begin(), current.end());
        move(current, nx, ny);
    }
    else{
        return blue(x, y, d, current, i);
    }

    if(play[nx][ny].size() >= 4){
    	return true;
    }
    else{
    	return false;
    }
}

int main(void){
    cin >> N >> K;
    
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){
            cin >> board[i][j];
        }
    }

    for(int i = 0; i < K; i++){
        int x, y, d;
        cin >> x >> y >> d;
        
        player.push_back({{x, y}, d});
        play[x][y] = to_string(i);
    }
    
    while(ans <= 1000){
    	bool check = false;
    	
        for(int i = 0; i < K; i++){
            int x = player[i].first.first;
            int y = player[i].first.second;
            int d = player[i].second;
            int nx = x + directX[d];
            int ny = y + directY[d];
            int index = play[x][y].find(to_string(i));
            string current = play[x][y].substr(index);

            play[x][y] = play[x][y].substr(0, index);

            if(nx > 0 && nx <= N && ny > 0 && ny <= N){
                check = movePlayer(x, y, d, current, nx, ny, i);
            }
            else{
                check = blue(x, y, d, current, i);
            }
            
            if(check){
            	cout << ans;
            	return 0;
            }
        }
        
        ans++;
    }

    cout << -1;

    return 0;
}
728x90
반응형

'백준 알고리즘' 카테고리의 다른 글

(백준 c++)11279 최대 힙  (1) 2021.04.28
(백준 c++)17822 원판 돌리기  (3) 2021.04.21
(백준 c++)17142 연구소3  (0) 2021.04.16
(백준 c++)17143 낚시왕  (0) 2021.04.16
(백준 c++)5430 AC  (0) 2021.04.15