본문 바로가기
알고리즘

[알고리즘] c++ cpp 새로운게임 2

by keel_im 2020. 10. 14.
반응형

포인트

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

댓글