250x250
반응형
Notice
Recent Posts
Recent Comments
Link
N
(백준 c++)17837 새로운 게임 2 본문
728x90
반응형
구현 및 시뮬레이션 문제.
주요 변수 및 함수 설명/
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 |