반응형
19236번: 청소년 상어
첫째 줄부터 4개의 줄에 각 칸의 들어있는 물고기의 정보가 1번 행부터 순서대로 주어진다. 물고기의 정보는 두 정수 ai, bi로 이루어져 있고, ai는 물고기의 번호, bi는 방향을 의미한다. 방향 bi는
www.acmicpc.net
다시 풀어본 청소년 상어
//청소년 상어
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct fishLoc {
int x;
int y;
int dir;
};
int map[5][5];
int visited[5][5];
fishLoc fish[17];
int dx[9] = {0, -1,-1,0,1,1,1,0,-1 };
int dy[9] = {0, 0,-1,-1,-1,0,1,1,1 };
int tempFish;
void copyMap(int tmpMap[5][5], fishLoc tmpFish[17]) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
tmpMap[i][j] = map[i][j];
}
}
for (int i = 1; i <= 16; i++) {
tmpFish[i] = fish[i];
}
}
void copyTemp(int tmpMap[5][5], fishLoc tmpFish[17]) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
map[i][j] = tmpMap[i][j];
}
}
for (int i = 1; i <= 16; i++) {
fish[i] = tmpFish[i];
}
}
void moveFish() {
for (int i = 1; i <= 16; i++) {
int dir = fish[i].dir;
for (int d = dir; d < dir + 8; d++) {
int x = fish[i].x;
int y = fish[i].y;
int dd = d > 8 ? d % 8 : d;
int nx = x + dx[dd % 9];
int ny = y + dy[dd % 9];
if (fish[i].dir == 0) continue;
if (nx >= 0 && ny >= 0 && nx < 4 && ny < 4 && map[nx][ny] != -1 && map[x][y] != -1 ) {
tempFish = map[nx][ny];
map[x][y] = tempFish;
fish[tempFish].x = x; fish[tempFish].y = y;
map[nx][ny] = i;
fish[i].x = nx; fish[i].y = ny;
fish[i].dir = d > 8 ? d % 8 : d;
break;
}
}
}
}
int moveShark(int sx, int sy, int sdir,int eat) {
moveFish();
int tmpMap[5][5];
fishLoc tmpFish[17];
int eatedFish = 0;
copyMap(tmpMap, tmpFish);
for (int i = 1; i <= 4; i++) {
int nx = sx + dx[sdir] * i;
int ny = sy + dy[sdir] * i;
if (nx >= 0 && ny >= 0 && nx < 4 && ny < 4 && map[nx][ny] > 0) {
int ndir = fish[map[nx][ny]].dir;
map[sx][sy] = 0;
fish[map[nx][ny]].x = fish[map[nx][ny]].y = fish[map[nx][ny]].dir = 0;
int ef = map[nx][ny];
map[nx][ny] = -1;
eatedFish = max(moveShark(nx, ny, ndir, eat + ef),eatedFish);
copyTemp(tmpMap, tmpFish);
}
}
return max(eat, eatedFish);
}
int main() {
int dir;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
scanf("%d%d", &map[i][j], &dir);
fish[map[i][j]] = { i,j,dir };
}
}
//맨처음 0,0에서 물고기 먹음
int sdir = fish[map[0][0]].dir;
fish[map[0][0]].x = fish[map[0][0]].y = fish[map[0][0]].dir = 0;
int f = map[0][0];
map[0][0] = -1; // -1은 상어 0은 암것도 없음
//물고기 이동 , 상어 이동
printf("%d",moveShark(0, 0, sdir,f));
return 0;
}
반응형
'CS > 알고리즘' 카테고리의 다른 글
프로그래머스 - 문자열 압축 (0) | 2021.04.12 |
---|---|
프로그래머스 - 네트워크 (dfs) (0) | 2021.03.06 |
백준 20056 마법사 상어와 파이어볼 (시뮬) (0) | 2021.02.15 |
백준 20055 컨베이어 벨트 위의 로봇(시뮬) (0) | 2021.02.14 |
백준 마법사 상어와 토네이도 20057번(시뮬) (0) | 2021.02.06 |