Jun's Development Journey
[BOJ] 16956 늑대와 양 본문
문제
16956번: 늑대와 양
크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게
www.acmicpc.net
풀이
- BFS 라고 하기엔 애매하지만 늑대 위치를 입력하면서 저장해놓고, 늑대 위치에서만 상,하,좌,우 검사해줬다.
- 네 방향 검사하면서 S가 나오면 어떻게든 막을 수 없는 경우이고, 그 이외엔 D를 찍어주면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Wolf{
int r,c;
public Wolf(int r, int c){
this.r = r;
this.c = c;
}
}
public class Main {
static boolean chk_bdr(int r, int c, int R, int C){
if((r>=0 && r<R)&&(c>=0&& c<C))
return true;
return false;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
ArrayList<Wolf> list = new ArrayList<>();
char[][] map;
int[] dr = {-1,1,0,0}, dc = {0,0,-1,1};
boolean chk = true;
int R = Integer.parseInt(st.nextToken()), C = Integer.parseInt(st.nextToken());
map = new char[R][C];
for(int i=0;i<R;i++){
String str = br.readLine();
for(int j=0;j<C;j++){
map[i][j] = str.charAt(j);
if(str.charAt(j)=='W')
list.add(new Wolf(i,j));
}
}
//계산
for(int i=0;i<list.size();i++){
if(chk){
Wolf w = list.get(i);
for(int j=0;j<4;j++){
int cr = w.r+dr[j], cc = w.c+dc[j];
if(chk_bdr(cr,cc,R,C)){
if((map[cr][cc]=='.'))
map[cr][cc] = 'D';
else if((map[cr][cc]=='S')){
chk = false;
break;
}
}
}
}
}
//출력
if(chk){
System.out.println("1");
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
sb.append(map[i][j]);
}
sb.append("\n");
}
System.out.println(sb);
}
else
System.out.println("0");
}
}
'BOJ > BFS' 카테고리의 다른 글
[BOJ] 17836번 공주님을 구해라! (0) | 2021.04.06 |
---|---|
[BOJ] 13913 숨바꼭질 4 (0) | 2021.03.16 |
[BOJ] 9372 상근이의 여행 (0) | 2021.02.26 |