일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- ICER
- 수영대회결승전
- 백준
- 3Dreconstruction
- 포탑부수기
- Calibration
- 루돌프의반란
- dfs
- ARM
- 조합
- 이진탐색
- 마이크로프로세서
- BFS
- 왕실의기사대결
- 토끼와 경주
- DenseDepth
- ros
- 코드트리빵
- ISER
- 싸움땅
- 마법의숲탐색
- 소프티어
- 나무박멸
- 슈퍼컴퓨터클러스터
- 시뮬레이션
- 삼성기출
- 순서대로방문하기
- 구현
- DP
- 코드트리
Archives
- Today
- Total
from palette import colorful_colors
[백준] 16236 아기상어 with C++ 본문
구조체 사용,
sort를 이용한 벡터 정렬 사용
BFS, 정렬 연습에 좋은 문제!
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int N, startY, startX;
int MAP[21][21];
int visited[21][21];
int dy[4] = { -1, 1, 0, 0 };
int dx[4] = { 0, 0, 1, -1 };
int babyShark = 2;
int mapTime, feedCnt;
struct fish
{
int dist;
int y;
int x;
};
struct Node
{
int y;
int x;
};
bool compare(fish a, fish b) { // 나중에 fishes 벡터를 정렬하기 위한 함수
if (a.dist == b.dist) {
if (a.y == b.y)
return a.x < b.x;
else
return a.y < b.y;
}
else {
return a.dist < b.dist;
}
}
vector <fish> fishes; // 먹을 수 있는 물고기들 저장
// bfs를 돌면서 먹을 수 있는 물고기는 fishes에 저장
void bfs(int startY, int startX) {
memset(visited, 0, sizeof(visited));
queue <Node> q;
q.push({ startY, startX });
while (!q.empty()) {
Node now = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
int ny = now.y + dy[i];
int nx = now.x + dx[i];
if (ny < 0 || nx < 0 || ny >= N || nx >= N)
continue;
if ((visited[ny][nx] != 0) || (MAP[ny][nx] > babyShark))
continue;
if (MAP[ny][nx] != 0 && MAP[ny][nx] < babyShark) {
fishes.push_back({ visited[now.y][now.x] + 1, ny, nx });
}
q.push({ ny, nx });
visited[ny][nx] = visited[now.y][now.x] + 1;
}
}
}
// 아기상어 움직이는 함수
void move() {
while (true)
{
fishes.clear();
bfs(startY, startX);
if (fishes.size() == 0) // 상어 없을때 엄마 찾으러 종료 ~
return;
sort(fishes.begin(), fishes.end(), compare);
fish curFeed = fishes[0];
MAP[curFeed.y][curFeed.x] = 0;
startY = curFeed.y;
startX = curFeed.x;
mapTime += curFeed.dist;
feedCnt++;
if (feedCnt == babyShark) { // 자기 몸집만큼 먹으면 몸집 커지기
babyShark++;
feedCnt = 0; // 먹은 개수 초기화
}
}
}
int main() {
cin >> N;
int temp;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> temp;
MAP[i][j] = temp;
if (temp == 9) {
startY = i;
startX = j;
MAP[i][j] = 0;
}
}
}
move();
cout << mapTime;
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[SWEA] 1949 등산로 조성 with C++ (0) | 2024.03.03 |
---|---|
[SWEA] 3234 준환이의 양팔저울 with C++ (0) | 2024.03.03 |
[SWEA] 2382 미생물 격리 with C++ (0) | 2024.02.21 |
[백준] 14503 로봇 청소기 with C++ (삼성기출) (1) | 2024.02.19 |
[백준] 15685 드래곤 커브 with C++ (삼성기출) (1) | 2024.02.19 |