๋ฌธ์
์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
#include <memory.h>
using namespace std;
int N, _time;
int map[21][21], cost[21][21];
int shark_r, shark_c, shark_size, now_eat_cnt;
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
bool visited[21][21];
pair<int,int> find_near_fish_coor(){ // ํ์ฌ ์์ด์์น์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ์ ์ขํ๋ฅผ ์ฐพ์
int min_dist = 1e9;
int fish_r = 1e9, fish_c = 1e9;
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
if(map[i][k] !=9 && map[i][k]!=0 && map[i][k]<shark_size && cost[i][k] != 0){
int dist = cost[i][k];
if(dist == min_dist){ // ๋ฌผ๊ณ ๊ธฐ์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ๋
if(i == fish_r){ // ๋ฌผ๊ณ ๊ธฐ์ ๋์ด๊ฐ ๊ฐ์ ๋
if(k <= fish_c){ // ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ณ ๋ฆ
fish_r = i;
fish_c = k;
min_dist = dist;
}
}
else if(i<fish_r){
fish_r = i;
fish_c = k;
min_dist = dist;
}
}
else if(dist<min_dist){
fish_r = i;
fish_c = k;
min_dist = dist;
}
}
}
}
return {fish_r, fish_c};
}
void cal_dist(int r, int c){
visited[r][c] = 1;
queue<pair<int,int>> q;
q.push({r,c});
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0 && nx<N && ny>=0 && ny<N){
if(!visited[nx][ny] && shark_size>=map[nx][ny]){ // ์๊ธฐ ์์ด๋ ์์ ๊ณผ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฑฐ๋ ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ์ง๋๊ฐ ์ ์์
visited[nx][ny] = 1;
cost[nx][ny] = cost[x][y] + 1;
q.push({nx, ny});
}
}
}
}
}
bool move_and_eat_fish(pair<int,int> fish_coor){
int x = fish_coor.first;
int y = fish_coor.second;
if(x == 1e9 || y == 1e9) return false; // ์์ด๋ณด๋ค ๋ฉ์น๊ฐ ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ง๋ง ๋ฉ์น๊ฐ ํฐ ๋ฌผ๊ณ ๊ธฐ๋ค ๋๋ฌธ์ ๋จน์ผ๋ฌ ๊ฐ์ง ๋ชปํ ๊ฒฝ์ฐ
_time += cost[x][y];
map[shark_r][shark_c] = 0;
shark_r = x;
shark_c = y;
map[shark_r][shark_c] = 9;
now_eat_cnt++;
if(now_eat_cnt == shark_size){
shark_size++;
now_eat_cnt = 0;
}
return true;
}
bool isfish(){ // ๋จน์ ์ ์๋๋ฌผ๊ณ ๊ธฐ๊ฐ ๋จ์์๋์ง ํ์ธ
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
if(map[i][k] == 9) continue;
if(map[i][k]!=0 && map[i][k] < shark_size) return true;
}
}
return false;
}
void simulation(){
while(isfish()){
cal_dist(shark_r, shark_c);
if(!move_and_eat_fish(find_near_fish_coor())) return;
memset(visited, 0 ,sizeof(visited));
memset(cost, 0, sizeof(cost));
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>N;
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
cin>>map[i][k];
if(map[i][k] == 9){
shark_r = i;
shark_c = k;
shark_size = 2;
}
}
}
simulation();
cout<<_time;
}
ํ์ด
- bfs๋ฅผ ํตํด์ ๊ฐ ๋ฌผ๊ณ ๊ธฐ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํฉ๋๋ค. (์ด๋ ์์ด๋ ์์ ๋ณด๋ค ํฌ๊ธฐ๊ฐ ๊ฐ๊ฑฐ๋ ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ์ง๋ ์ ์์ต๋๋ค.)
- ๊ทธ ํ, ํ์ฌ ์์ด์ ์์น์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ์ ์ขํ๋ฅผ ๊ตฌํฉ๋๋ค.(์ด๋ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๋ค๋ฉด ์กฐ๊ฑด ์ฐ์ ์์์ ๋ง๋ ์ขํ๋ฅผ ๊ตฌํฉ๋๋ค.)
- ์ด์ ์์ด๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊น์ง์ ์ขํ๋ก ์ด๋์ํต๋๋ค. ์ด๋ ์๋์ ๊ฐ์ด ํฐ ๋ฌผ๊ณ ๊ธฐ๋ค๋ก ๋๋ฌ์ธ์ธ ์ ๋ ฅ์ผ ๊ฒฝ์ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ์ ์ขํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ข ๋ฃ์ํต๋๋ค.
2
3 9
1 3
๊ทธ ํ ์์ด๊ฐ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋์ฌ ๋ ๊น์ง ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 17144๋ฒ - ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2022.09.02 |
---|---|
[๋ฐฑ์ค,c++] 1761๋ฒ - ์ ์ ๋ค์ ๊ฑฐ๋ฆฌ (0) | 2022.09.01 |
[๋ฐฑ์ค,c++] 11438๋ฒ - LCA 2 (0) | 2022.08.30 |
[๋ฐฑ์ค,c++] 15686๋ฒ - ์นํจ ๋ฐฐ๋ฌ (0) | 2022.08.26 |
[๋ฐฑ์ค,c++] 16234๋ฒ - ์ธ๊ตฌ ์ด๋ (0) | 2022.08.25 |
[๋ฐฑ์ค,c++] 17135๋ฒ - ์บ์ฌ๋ํ์ค (2) | 2022.08.25 |
๋๊ธ