입력을 받을때 양과 늑대의 위치를 큐에 넣어주고 bfs를 돌려 동시에 찾는다
늑대를 먼저 큐에서 빼든 양을 먼저 빼든 상관이 없다
큐에서 맨 처음 빼낸 좌표가 늑대인지 양인지 파악한 후 갯수를 1 더해주고 그 좌표를 기준으로 벽으로 막힌 곳까지 늑대와 양을 다 찾아낸다
찾아내서 누가 먼저 잡아먹히는지 비교해서 값에 넣어주고 큐에서 다음 늑대 혹은 양을 꺼내 확인한다
이때 방문처리를 통해 같은 공간에 있던 늑대 혹은 양인지 확인한 후 방문처리가 되어있으면 큐에서 그 다음 좌표를 꺼내 또 dfs를 시작한다
이 과정을 반복하여 늑대와 양의 수를 세게 된다.
#include <iostream>
#include <queue>
#define visited true
#define Non_visited false
#define MAX 251
using namespace std;
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0,-1};
char cArr[MAX][MAX];
bool Check[MAX][MAX];
int Sheep;
int Wolf;
queue<pair<int,int>> SheepWolf;
void bfs(int M, int N){
while(!SheepWolf.empty()){
int xStart=SheepWolf.front().first;
int yStart=SheepWolf.front().second;
SheepWolf.pop();
if(Check[xStart][yStart]) continue;
Check[xStart][yStart]=visited;
queue<pair<int,int>> q;
q.push(make_pair(xStart,yStart));
int sheep=0;
int wolf=0;
if(cArr[xStart][yStart]=='k') sheep++;
if(cArr[xStart][yStart]=='v') wolf++;
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+xx[i];
int ny=y+yy[i];
if(nx<0 || nx>=M || ny<0 || ny>=N || cArr[nx][ny]=='#' || Check[nx][ny]) continue;
if(cArr[nx][ny]=='k'){
Check[nx][ny]=visited;
sheep++;
}
if(cArr[nx][ny]=='v'){
Check[nx][ny]=visited;
wolf++;
}
if(cArr[nx][ny]=='.'){
Check[nx][ny]=visited;
}
q.push(make_pair(nx,ny));
}
}
if(sheep>wolf){
Sheep+=sheep;
}
else
Wolf+=wolf;
}
// while(!sheep.empty()){
// int x=sheep.front().first;
// int y=sheep.front().second;
// sheep.pop();
//
// if(Check[x][y]) continue;
//
// Check[x][y]=visited;
//
// for(int i=0;i<4;i++){
// int nx=x+xx[i];
// int ny=y+yy[i];
//
// if(nx<0 || nx>=M || ny<0 || ny>=N || cArr[nx][ny]=='#') continue;
// if(cArr[nx][ny]=='k'){
// Check[nx][ny]=visited;
// }
// }
// }
}
int main(){
int M,N; // 9 12 행 9 열 12 -> x좌표 12 y좌표 9
cin>>M>>N;
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
char Char;
cin >> Char;
if(Char=='v' || Char=='k'){
SheepWolf.push(make_pair(i,j));
}
cArr[i][j]=Char;
}
}
bfs(M,N);
cout << Sheep << " " << Wolf << endl;
// for(int i=0;i<M;i++){
// for(int j=0;j<N;j++){
// cout << cArr[i][j] << " ";
// }
// cout << endl;
// }
}
'Coding > 백준' 카테고리의 다른 글
| 2606번 바이러스 (0) | 2019.09.09 |
|---|---|
| 10844번 쉬운 계단 수 (0) | 2019.09.06 |
| 1003번 피보나치 함수 (0) | 2019.09.03 |
| 14502번 연구소 (0) | 2019.09.03 |
| 1937번 욕심쟁이 판다 (0) | 2019.09.03 |