반응형
포인트
1. 구현을 할 수 있는가?
2. 파란칸, 빨간칸, 하얀칸
🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다.
#include<iostream>
#include<vector>
#define endl "\n"
#define MAX 12
#define CHESS_MAX 10
using namespace std;
struct unit {
int x;
int y;
int direction;
};
int n, k;
int map[MAX][MAX];
vector<int> mapState[MAX][MAX];
unit units[CHESS_MAX];
int dx[] = {0, 0, 0, -1, 1};
int dy[] = {0, 1, -1, 0, 0};
int Find_Delete_Num(int x, int y, int Chess_Num) { /* 해당 말을 옮긴 후, 기존 좌표에서 몇 번 삭제를 해야 하는지 찾는 함수. */
int Cnt = 0;
for (int i = mapState[x][y].size() - 1; i >= 0; i--) {
if (mapState[x][y][i] == Chess_Num) break;
Cnt++;
}
return Cnt + 1;
}
int reverseDir(int dir) {
int Dir = units[dir].direction;
if (Dir == 1) return 2;
else if (Dir == 2) return 1;
else if (Dir == 3) return 4;
else if (Dir == 4) return 3;
}
void move(int x, int y, int nx, int ny, int number, int pos, int Ms) {
if (Ms == 0) { // 흰색칸
for (int i = pos; i < mapState[x][y].size(); i++) {
mapState[nx][ny].push_back(mapState[x][y][i]);
int index = mapState[x][y][i];
units[index].x = nx;
units[index].y = ny;
}
int Delete_Num = Find_Delete_Num(x, y, number);
for (int i = 0; i < Delete_Num; i++) mapState[x][y].pop_back();
}
if (Ms == 1) { // 빨간 칸
for (int i = mapState[x][y].size() - 1; i >= pos; i--) {
mapState[nx][ny].push_back(mapState[x][y][i]);
int Idx = mapState[x][y][i];
units[Idx].x = nx;
units[Idx].y = ny;
}
int Delete_Num = Find_Delete_Num(x, y, number);
for (int i = 0; i < Delete_Num; i++) mapState[x][y].pop_back();
}
if (Ms == 2) { //파란칸
int Dir = reverseDir(number);
units[number].direction = Dir;
int nnx = x + dx[Dir];
int nny = y + dy[Dir];
if (nnx >= 0 && nny >= 0 && nnx < n && nny < n) {
if (map[nnx][nny] != 2) move(x, y, nnx, nny, number, pos, map[nnx][nny]);
}
}
}
int findPosition(int x, int y, int index) { /* 해당 말이 몇 번째에 위치하고 있는지 찾아서 return 하는 함수. */
for (int i = 0; i < mapState[x][y].size(); i++) {
if (mapState[x][y][i] == index) return i;
}
}
bool check() {
for (int i = 0; i < k; i++) {
int x = units[i].x;
int y = units[i].y;
if (mapState[x][y].size() >= 4) return true;
}
return false;
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < k; i++) {
int x, y, d;
cin >> x >> y >> d;
units[i] = {--x, --y, d};
mapState[x][y].push_back(i);
}
bool flag = false;
int time = 0;
while (1) {
if (time > 1000) break; // 게암 종료 조건
for (int i = 0; i < k; i++) {
int x = units[i].x;
int y = units[i].y;
int dir = units[i].direction;
int nx = x + dx[dir];
int ny = y + dy[dir];
int position = findPosition(x, y, i);
if (nx >= 0 && ny >= 0 && nx < n && ny < n) move(x, y, nx, ny, i, position, map[nx][ny]);
// 범위 안에 있으면
else move(x, y, nx, ny, i, position, 2);
// 범위 안에 ㅇ벗으면
if (check()) {
flag = true;
break;
}
}
if (flag) break;
time += 1;
}
if (flag == true) cout << time + 1 << endl;
else cout << -1 << endl;
return 0;
}
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] cpp c++ 다리 만들기2 (0) | 2020.10.14 |
---|---|
[알고리즘] 낚시왕 (0) | 2020.10.14 |
[알고리즘] 감시 (0) | 2020.10.14 |
[알고리즘] 테트로미노 (0) | 2020.10.14 |
[알고리즘] 괄호 추가하기 (0) | 2020.10.14 |
댓글