하 오늘 청소년 어른 상어를 풀었다..... 그래도 어른상어는 난이도가 조금 낮았던것같다.

그래도 코드는 엄청 길어졌다는거.......

이건 조건이 많아서 헷갈릴수있다. 차근차근하면 되는것같다.

1만 남을때까지 하는것이기 때문에 반복문을 통해서 1만 남을때까지 반복한다.

그다음에 냄새를 뿌리고, 상어가 이동한다. 이때 우선순위에따라서 잘 이동시켜준다.

비어있을경우 한번, 비어있지 않을경우 한번 해준다.

여기서 배열을 복사해주는게 좋은게 유효성 검사를 할때 앞에서 바뀌게 되면 일관성이 없어진다.

그래서 카피를 만들어 줘야한다.

끝..

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct shark {
    int x;
    int y;
    int dir;//쳐다보고있는 방향
    bool move = false;
    int prior[4][4];
    bool out = false;
};
struct pos_info {
    int smell_cnt;
    int smell_num;
    int shark_num;
};



int main() {
    int N, M, K;
    int time = 0;
    pos_info board[20][20];
    pos_info c_board[20][20];
    shark s_list[400];
    cin >> N >> M >> K;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> board[i][j].shark_num;
            board[i][j].smell_cnt = 0;
            board[i][j].smell_num = 0;
            if (board[i][j].shark_num != 0) {
                s_list[board[i][j].shark_num].x = i;
                s_list[board[i][j].shark_num].y = j;
            }
        }
    }
    for (int i = 1; i <= M; i++)cin >> s_list[i].dir; // 쳐다보고있는 방향
    for (int i = 1; i <= M; i++) {
        for (int j = 0; j < 4; j++) {
            for (int k = 0; k < 4; k++) {
                cin >> s_list[i].prior[j][k];
            }
        }
    }//입력받기

    while (1) {
        int s_cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (board[i][j].shark_num != 0)s_cnt++;
            }
        }
        if (s_cnt == 1) {
            cout << time << endl;
            break;
        }

        for (int i = 1; i <= M; i++) { 
            if (s_list[i].out)continue;
            s_list[i].move = false; 
        }
        
        for (int i = 1; i <= M; i++) {
            shark temp = s_list[i];
            if (temp.out)continue;
            board[temp.x][temp.y].smell_cnt = K;
            board[temp.x][temp.y].smell_num = i;
        }//방구끼고

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                c_board[i][j] = board[i][j];
            }
        }

        for (int i = M; i >= 1; i--) {
            shark temp = s_list[i];
            if (temp.out)continue;
            int dir_prior;
            for (int j = 0; j < 4; j++) {
                dir_prior = temp.prior[temp.dir - 1][j];//우선순위 순서대로 간다
                if (dir_prior == 1) {
                    if (temp.x - 1 < 0)continue;
                    if (board[temp.x - 1][temp.y].smell_cnt == 0) { // 냄새가 비어있을때
                        if (c_board[temp.x - 1][temp.y].shark_num != 0) {
                            s_list[c_board[temp.x - 1][temp.y].shark_num].out = true;
                        }
                        c_board[temp.x - 1][temp.y].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].x--;
                        s_list[i].move = true;
                        s_list[i].dir = 1;
                        break;
                    }
                }//상
                else if (dir_prior == 2) {
                    if (temp.x + 1 > N - 1)continue;
                    if (board[temp.x + 1][temp.y].smell_cnt == 0) {
                        if (c_board[temp.x + 1][temp.y].shark_num != 0) {
                            s_list[c_board[temp.x + 1][temp.y].shark_num].out = true;
                        }
                        c_board[temp.x + 1][temp.y].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].x++;
                        s_list[i].move = true;
                        s_list[i].dir = 2;
                        break;
                    }
                }//하
                else if (dir_prior == 3) {
                    if (temp.y - 1 < 0)continue;
                    if (board[temp.x][temp.y - 1].smell_cnt == 0) {
                        if (c_board[temp.x][temp.y-1].shark_num != 0) {
                            s_list[c_board[temp.x][temp.y-1].shark_num].out = true;
                        }
                        c_board[temp.x][temp.y - 1].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].y--;
                        s_list[i].move = true;
                        s_list[i].dir = 3;
                        break;
                    }
                }//왼
                else {
                    if (temp.y + 1 > N - 1)continue;
                    if (board[temp.x][temp.y + 1].smell_cnt == 0) {
                        if (c_board[temp.x][temp.y+1].shark_num != 0) {
                            s_list[c_board[temp.x][temp.y+1].shark_num].out = true;
                        }
                        c_board[temp.x][temp.y + 1].shark_num = i;
                        c_board[temp.x][temp.y].shark_num = 0;
                        s_list[i].y++;
                        s_list[i].move = true;
                        s_list[i].dir = 4;
                        break;
                    }
                }//오
            }
        }//비어있을때 이동

        for (int i = M; i >= 1; i--) {
            if (s_list[i].out)continue;
            if (!s_list[i].move) { //냄새가 다 차있어서 이동 못할때
                shark temp = s_list[i];
                int dir_prior;
                for (int j = 0; j < 4; j++) {
                    dir_prior = temp.prior[temp.dir - 1][j];
                    if (dir_prior == 1) {
                        if (temp.x - 1 < 0)continue;
                        if (board[temp.x - 1][temp.y].smell_num == i) {
                            if (c_board[temp.x-1][temp.y].shark_num != 0) {
                                s_list[c_board[temp.x-1][temp.y].shark_num].out = true;
                            }
                            c_board[temp.x - 1][temp.y].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].x--;
                            s_list[i].move = true;
                            s_list[i].dir = 1;
                            break;
                        }
                    }
                    else if (dir_prior == 2) {
                        if (temp.x + 1 > N - 1)continue;
                        if (board[temp.x + 1][temp.y].smell_num == i) {
                            if (c_board[temp.x + 1][temp.y].shark_num != 0) {
                                s_list[c_board[temp.x + 1][temp.y].shark_num].out = true;
                            }
                            c_board[temp.x + 1][temp.y].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].x++;
                            s_list[i].move = true;
                            s_list[i].dir = 2;
                            break;
                        }
                    }
                    else if (dir_prior == 3) {
                        if (temp.y - 1 < 0)continue;
                        if (board[temp.x][temp.y - 1].smell_num == i) {
                            if (c_board[temp.x][temp.y - 1].shark_num != 0) {
                                s_list[c_board[temp.x][temp.y - 1].shark_num].out = true;
                            }
                            c_board[temp.x][temp.y - 1].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].y--;
                            s_list[i].move = true;
                            s_list[i].dir = 3;
                            break;
                        }
                    }
                    else {
                        if (temp.y + 1 > N - 1)continue;
                        if (board[temp.x][temp.y + 1].smell_num == i) {
                            if (c_board[temp.x][temp.y + 1].shark_num != 0) {
                                s_list[c_board[temp.x][temp.y + 1].shark_num].out = true;
                            }
                            c_board[temp.x][temp.y + 1].shark_num = i;
                            c_board[temp.x][temp.y].shark_num = 0;
                            s_list[i].y++;
                            s_list[i].move = true;
                            s_list[i].dir = 4;
                            break;
                        }
                    }
                }
            }
        }
        //이동

       

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                board[i][j] = c_board[i][j];
                if (board[i][j].shark_num == 0 and board[i][j].smell_cnt>0) {
                    board[i][j].smell_cnt--;
                    if (board[i][j].smell_cnt == 0)board[i][j].smell_num = 0;
                }
            }
        }//상어없는 모든칸에 냄새 하나줄이기

       

        time++;
        if (time > 1000) {
            cout << -1 << endl;
            return 0;
        }
    }
}

+ Recent posts