● 문제출처
●정리(요약)
16*16 배열에 1은 벽을 나타내며 0은 길, 2는 출발점, 3은 도착점을 나타내어 도착점까지 도달 가능 여부를 1 또는 0으로 표시하는 프로그램을 작성
●코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Solution
{
static String [][] arr;
static int [][] pos;
static int [] dirX = {1,0,-1,0};
static int [] dirY = {0,1,0,-1};
static boolean [][]visited;
static boolean isFind;
public static void main(String args[])throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb= new StringBuilder();
StringTokenizer st;
for(int i =1 ; i<=10;i++) {
int T = Integer.parseInt(br.readLine());
arr= new String[16][16];
visited =new boolean[16][16];
// 0 : 2(출발점) 1: 3(도착점)
// 0 : x 1 : y
pos = new int[2][2];
isFind=false;
for(int j =0; j<arr.length; j++) {
String str = br.readLine();
for(int k=0; k<arr[j].length; k++) {
arr[j]=str.split("");
if(arr[j][k].equals("2")) {
pos[0][0]=k;
pos[0][1]=j;
}else if(arr[j][k].equals("3")) {
pos[1][0]=k;
pos[1][1]=j;
}
}
}
maze(pos[0][0],pos[0][1]);
sb.append("#").append(i).append(" ").append(isFind?1:0).append("\n");
}
System.out.println(sb.toString());
}
public static boolean maze(int x , int y) {
for(int i =0; i<4; i++) {
int newX = x+dirX[i];
int newY = y+dirY[i];
if(newX==pos[1][0]&&newY==pos[1][1]) {
isFind = true;
}
if(0<newX&&newX<16&&0<newY&&newY<16&&arr[newY][newX].equals("0")&&visited[newY][newX]==false) {
visited[newY][newX]=true;
maze(newX,newY);
visited[newY][newX]=false;
}
}
return false;
}
}
● 느낀점
비슷한 문제를 풀어봐서 그런지 D4치고 좀 쉬웠다.
maze를 만들어 DFS로 풀었다.(boolean -> void 를 해도 무방하다.)