Created
April 23, 2021 15:51
-
-
Save Bloofer/aa4f4474247b58ee4c85380c50e098fc to your computer and use it in GitHub Desktop.
shark2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <vector> | |
| #include <algorithm> | |
| using namespace std; | |
| typedef struct{ | |
| int x, y, dir; | |
| bool dead; | |
| } FISH; | |
| int arr[4][4]; // 물고기: 1~16, 상어: -1, 빈칸: 0 | |
| FISH fishArr[17]; // 인덱스별(1~16) 물고기 정보 | |
| int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; | |
| int dy[8] = {0, -1, -1, -1, 0, 1, 1, 1}; | |
| int ans = 0; | |
| bool available(int x, int y){ return x >= 0 && y >= 0 && x < 4 && y < 4; } | |
| void move_fish(){ | |
| for (int i = 1; i <= 16; i++) { | |
| if(fishArr[i].dead) continue; // 죽은 물고기는 이동 제외 | |
| // 현재 위치에서 45도씩 돌려보면서 해당 위치에 물고기 살아있으면, 이동 | |
| for (int j = 0; j < 8; j++) { | |
| int ndir = (fishArr[i].dir + j) % 8; | |
| int mx = fishArr[i].x; | |
| int my = fishArr[i].y; | |
| int nx = mx + dx[ndir]; | |
| int ny = my + dy[ndir]; | |
| // 물고기 바라보는 방향이 범위 벗어나지 않으면서, 다른 물고기 있는 위치일 때(상어/빈칸 X) | |
| if(available(nx, ny)){ | |
| if(arr[nx][ny] > 0){ | |
| fishArr[arr[nx][ny]].x = mx; | |
| fishArr[arr[nx][ny]].y = my; | |
| fishArr[i].x = nx; | |
| fishArr[i].y = ny; | |
| fishArr[i].dir = ndir; | |
| swap(arr[mx][my], arr[nx][ny]); | |
| break; | |
| } else if(arr[nx][ny] == 0){ | |
| fishArr[i].x = nx; | |
| fishArr[i].y = ny; | |
| fishArr[i].dir = ndir; | |
| swap(arr[mx][my], arr[nx][ny]); | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| void dfs(int nx, int ny, int ndir, int sum){ | |
| ans = max(sum, ans); // 물고기 번호 최대합 업데이트 | |
| // 먼저 현재의 배열 / 물고기 정보 상태를 임시 배열에 불러온다.(백트랙킹용) | |
| int tmpArr[4][4]; | |
| FISH tmpFarr[17]; | |
| for (int i = 0; i < 4; i++) copy(arr[i], arr[i]+4, tmpArr[i]); | |
| copy(fishArr, fishArr+17, tmpFarr); | |
| // 2. 각 물고기들 이동 시작 | |
| move_fish(); | |
| // 3. 물고기 이동 후, 상어이동: 1~3칸 이동 가능한 칸 DFS | |
| for (int i = 1; i <= 3; i++) { | |
| int sx = nx + (dx[ndir] * i); | |
| int sy = ny + (dy[ndir] * i); | |
| if(!available(sx, sy)) break; | |
| if(arr[sx][sy] > 0) { // 이동가능하며 해당 칸에 물고기 있을 때, | |
| int nxt = arr[sx][sy]; | |
| arr[sx][sy] = -1; | |
| arr[nx][ny] = 0; | |
| fishArr[nxt].dead = true; | |
| dfs(sx, sy, fishArr[nxt].dir, sum+nxt); | |
| fishArr[nxt].dead = false; | |
| arr[nx][ny] = -1; | |
| arr[sx][sy] = nxt; | |
| } | |
| } | |
| for (int i = 0; i < 4; i++) copy(tmpArr[i], tmpArr[i]+4, arr[i]); | |
| copy(tmpFarr, tmpFarr+17, fishArr); | |
| } | |
| int main(){ | |
| for (int i = 0; i < 4; i++) { | |
| for (int j = 0; j < 4; j++) { | |
| FISH tmpFish = FISH{i,j,0,false}; | |
| cin >> arr[i][j] >> tmpFish.dir; | |
| tmpFish.dir--; | |
| fishArr[arr[i][j]] = tmpFish; | |
| } | |
| } | |
| // 1. 상어가 (0,0) 이동 해당 물고기 먹고 dfs 함수 시작 | |
| int nxt = arr[0][0]; | |
| fishArr[nxt].dead = true; | |
| arr[0][0] = -1; | |
| dfs(0, 0, fishArr[nxt].dir, nxt); | |
| cout << ans << endl; | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment