하 오늘 청소년 어른 상어를 풀었다..... 그래도 어른상어는 난이도가 조금 낮았던것같다.
그래도 코드는 엄청 길어졌다는거.......
이건 조건이 많아서 헷갈릴수있다. 차근차근하면 되는것같다.
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;
}
}
}
'Development > BOJ' 카테고리의 다른 글
[BOJ] 백준 1992번: 쿼드트리 C++ : 아주정은 (0) | 2020.10.27 |
---|---|
[BOJ] 백준 20055번: 컨베이어 벨트 위의 로봇 C++ : 아주정은 (0) | 2020.10.21 |
[BOJ] 백준 15683번 : 감시 C++ : 아주정은 (0) | 2020.10.17 |
[BOJ] 백준 19236번 : 청소년 상어 C++ : 아주정은 (0) | 2020.10.16 |
[BOJ] 백준 1181번 : 단어 정렬 C++ : 아주정은 (0) | 2020.05.07 |