bfs를 상,하,좌,우에 대해 해본다
상,하,좌,우 네 방향의 클러스터가 bfs 하다가 땅을 만나면 (i가 N-1인 블럭이 있다면) 떨어뜨리지 않음.
bfs의 방문 체크는 던지는 방향(0 또는 1로 표시)을 bool값에 넣는다.
bfs할 땐 크기 C인 vector 2개에 각 j에 대한 i의 최대치와 최소치를 갱신한다.
i의 최소치에서부터 다음 유효 블럭 까지의 거리를 구하고, 만약 최소치가 갱신됐다면 기준 낙하 위치를 갱신한다.
최대치와 최소치에 있는 블럭들을 최소 낙하 거리만큼 아래로 내린다.
(클러스터가 떨어지는 순서가 달라지면 모양도 달라지는 경우가 있는데, 문제에서 클러스터 2개가 동시에 떨어지는 일은 없다고 제한해줌.)
클러스터를 하나 떨어뜨리면 그 다음 막대 던지기로 넘어가도 된다.
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef pair<int,int> pii;
int R,C,N,H; // H는 idx+1임
vvi cave;
vvi visited;
pii[4] dirArr = {{-1,0},{0,1},{1,0},{0,-1}};
queue<pii> q;
// 던지는 방향을 visit_flag로써 사용한다
bool isGrounded(int target, pii dir, int visit_flag, &pii minFallPoint)
{
bool grounded = false;
vector<int> maxHeight = new vector<int>(C,0);
vector<int> minHeight = new vector<int>(C,100);
// bfs 했는데 땅을 만나면 true, 못 만나면 false
q.push({H-1+dir.first,target+dir.second});
while(!q.empty())
{
pii ij = q.front(); q.pop();
if(maxHeight[ij.second] <= ij.first)
maxHeight[ij.second] = ij.first;
else if(minHeight[ij.second] >= ij.first)
minHeight[ij.second] = ij.first;
if(ij.first == 0) grounded = true;
for(int i=0; i<3; i++)
{
int newi = ij.first + dirArr[i].first;
int newj = ij.second + dirArr[i].second;
if(0<=newi && newi<R; 0<=newj && newj<C
&& visited[newi][newj] != visit_flag)
{
q.push({newi,newj});
visited[newi][newj] = visit_flag;
}
}
}
if(grounded) return true;
// minFallPoint 구하기
for(int j=0; j<C; j++)
{
for(int nc=minHeight[j]-1; -1<nc; nc--)
{
if(cave[nc][j] == 'x')
}
}
return false;
}
void Simulate(int leftOrRight)
{
int target = -1;
if(leftOrRight == 0)
for(int j=0; j<R; i++)
if(cave[H-1][j] == 'x') {target = j; break;}
if(leftOrRight == 1)
for(int j=R-1; -1<j; i--)
if(cave[H-1][j] == 'x') {target = j; break;}
pii minFallPoint = {-1,-1};
for(int i=0; i<3; i++)
if(isGrounded(target,dirArr[i],leftOrRight,&minFallPoint))
}
void Input()
{
cin >> R >> C;
cave = new vvi(R,vector<int>(C));
visited = new vvb(R,vector<bool>(C,1));
for(int i=0; i<R; i++)
for(int j=0; j<C; j++)
cin >> cave[i][j];
cin >> N >> H;
}
int main()
{
Input();
for(int i=0; i<N; i++) Simulate(i%2);
}
내일 마저