[BOJ] 16236 : 아기 상어
풀이
시뮬레이션 BFS
삼성 기출 변형문제.
전형적인 BFS로 탐색하는 시뮬레이션 문제이다.
여기서 위쪽일수록, 왼쪽일수록(즉 x가작고 y가 작을수록) 우선 탐색하라는 규칙이 있다.
그걸 나는 const int dx[] = { -1,0,0,1 }; const int dy[] = { 0,-1,1,0 };
이렇게 설정하는것으로 충분할줄 알았다.
하지만 위쪽으로갔다가 오른쪽으로가는것보다 왼쪽으로갔다가 위로가는것이 앞서야해서 결국 우선순위큐 사용했다.
우선순위큐로 최소를 우선순위로 두되, cnt가 앞이고 x,y순서대로 다음을 따른다면
cnt가 작을수록 그다음 x가 작을수록 그다음 y가 작은게 큐에서 앞서게 된다.
priority_queue<pair<int, pair<int, int»,vector<pair<int, pair<int, int»>,greater<pair<int, pair<int, int»» q;
이렇게 만들면 된다.
(우선순위큐 꿀문제이다)
우선순위큐에서 struct를 쓰면 compare도 짜야하므로 편하게 pair 2중첩으로 만들었다.
코드
#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
#include <functional>
using namespace std;
//위,왼쪽,오른쪽,아래 우선순위를 줬다.
//하지만 위쪽으로갔다가 오른쪽으로가는것보다
//왼쪽으로갔다가 위로가는것이 앞서야해서 결국 우선순위큐 사용
const int dx[] = { -1,0,0,1 };
const int dy[] = { 0,-1,1,0 };
//0:빈칸 1~6:물고기크기 9:아기상어위치
int arr[20][20];
int chk[20][20];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
int sx, sy;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
if (arr[i][j] == 9) {
sx = i;
sy = j;
}
}
}
int ans = 0;
int sharkSize = 2;
int sizeCnt = 0;
arr[sx][sy] = 0;
while (1) {
memset(chk, 0, sizeof(chk));
priority_queue<pair<int, pair<int, int>>,vector<pair<int, pair<int, int>>>,greater<pair<int, pair<int, int>>>> q;
q.push({ 0,{sx,sy} });
chk[sx][sy] = 1;
int flag = 1;
while (!q.empty()) {
int x = q.top().second.first;
int y = q.top().second.second;
int cnt = q.top().first;
q.pop();
//크면갈수없다
if (arr[x][y] > sharkSize) {
continue;
}
//잡아먹는다
if (arr[x][y] >= 1 && arr[x][y] < sharkSize) {
arr[x][y] = 0;
sizeCnt++;
if (sizeCnt == sharkSize) {
sharkSize++;
sizeCnt = 0;
}
sx = x;
sy = y;
ans += cnt;
flag = 0;
/*
cout << '\n';
cout << x << ", " << y << " : " << ans << '\n';
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << arr[i][j] << ' ';
}
cout << '\n';
}
*/
break;
}
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx >= 0 && nx < n&&ny >= 0 && ny < n) {
if (chk[nx][ny] == 0) {
chk[nx][ny] = 1;
//우선순위큐로 옮김
q.push({ cnt + 1 ,{nx,ny}});
}
}
}
}
//못잡아먹었으면 종료
if (flag)
break;
}
cout << ans;
return 0;
}
Written on April 12, 2019