티스토리 뷰
핵심
출발점이 여러개가 될 수 있다면 BFS 시작전 출발점을 모두 큐에 넣어주고 시작하면 된다.
풀이
// 2020-05-22 wsshin
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int Solution(int SizeY, int SizeX, vector<vector<int>> vecBoard);
int main()
{
int SizeY = 0;
int SizeX = 0;
cin >> SizeX >> SizeY;
vector<vector<int>> vecBoard;
for (int i = 0; i < SizeY; i++)
{
vector<int> nTemp;
for (int j = 0; j < SizeX; j++)
{
int nInput = 0;
cin >> nInput;
nTemp.push_back(nInput);
}
vecBoard.push_back(nTemp);
}
int Result = Solution(SizeY, SizeX, vecBoard);
cout << Result;
return 0;
}
int Solution(int SizeY, int SizeX, vector<vector<int>> vecBoard)
{
// 시계방향 상우하좌
int dY[4] = { -1, 0, 1, 0 };
int dX[4] = { 0, 1, 0, -1 };
vector<vector<int>> vecVist(SizeY, vector<int>(SizeX, 0));
vector<vector<int>> vecDay(SizeY, vector<int>(SizeX, 0));
int nRipeTomatoCnt = 0;
int nDayCnt = 0;
int nNull = 0;
bool IsAllRipe = true;
vector<pair<int, int>> vecStartTomatoPos;
queue<pair<int, int>> queue;
//1. 최초 익은 토마토의 위치 찾기 및 스타트 정보 큐에 등록
for (int Y = 0; Y < SizeY; Y++)
{
for (int X = 0; X < SizeX; X++)
{
if (vecBoard[Y][X] == 1)
{
queue.push(make_pair(Y, X));
vecVist[Y][X] = 1;
vecDay[Y][X] = 0;
nRipeTomatoCnt++;
}
else if (vecBoard[Y][X] == 0)
{
IsAllRipe = false;
}
else if (vecBoard[Y][X] == -1)
{
nNull++;
}
}
}
// 이미 다 익어있다면 그냥 0반환
if (IsAllRipe == true) return 0;
//2. 실제 BFS 실행
while (!queue.empty())
{
int CurY = queue.front().first;
int CurX = queue.front().second;
queue.pop();
// 사방이 막혀있는지 확인
int nBlock = 0;
for (int i = 0; i < 4; i++)
{
int PushY = dY[i] + CurY;
int PushX = dX[i] + CurX;
if (PushY < 0 || PushY >= SizeY) continue;
if (PushX < 0 || PushX >= SizeX) continue;
if (vecBoard[PushY][PushX] == -1) continue;
if (vecVist[PushY][PushX] == 1) continue;
queue.push(make_pair(PushY, PushX));
vecVist[PushY][PushX] = 1;
vecDay[PushY][PushX] = vecDay[CurY][CurX] + 1;
nRipeTomatoCnt++;
nBlock = 0;
if (nDayCnt < vecDay[PushY][PushX])
{
nDayCnt = vecDay[PushY][PushX];
}
}
}
if (nRipeTomatoCnt < ((SizeY * SizeX) - nNull))
{
return -1;
}
return nDayCnt;
}
'Algoritem > Problem solving' 카테고리의 다른 글
팩토리얼 (0) | 2020.05.25 |
---|---|
소수 판별법 (0) | 2020.05.25 |
백준 : 2178번 미로 탐색(C++14)_BFS (0) | 2020.05.21 |
백준 : 1926번 그림(C++14)_BFS (0) | 2020.05.20 |
프로그래머스 : 카카오_크레인 인형 뽑기 게임(C++)_Stack (0) | 2020.05.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C
- UE5
- double free
- 람다
- rotator
- Lambda
- c++
- UE4
- LambdaFunction
- unrealengine
- bug
- coordinate system
- Trouble shooting
- 람다함수
- c++11
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함