250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- VeraandOutfits
- 2420번
- 14652번
- 5554번
- 5337번
- 10926번
- 11283번
- 11382번
- 백준
- 5522번
- next()과 nextLine()차이
- 14645번
- 6749번
- 13277번
- 10699번
- Java
- 9653번
- 구름알고리즘먼데이챌린지
- 5338번
- 8393번
- 11942번
- 8370번
- 10757번
- 설명하기힘든문제
- 9654번
- 10170번
- 5339번
- 자바
- 알고리즘먼데이챌린지
- 15439번
Archives
- Today
- Total
lazylazylazylazylazylazylazylazy
백준[JAVA] 14503 로봇청소기 + 예제2번 20번이 나오는 이유 예측(자바) 본문
프로그래밍/Break BOJ byJAVA
백준[JAVA] 14503 로봇청소기 + 예제2번 20번이 나오는 이유 예측(자바)
lazylazylazylazylazylazylazylazy 2023. 1. 2. 00:37728x90
반응형
----------------------------------------------------------------------------------------------------------------
주어진 행동양식 차례대로 탐색을 진행하기때문에 dfs로 풀었습니다.
저도 예제2가 출력값으로 20이 자꾸 나와서 고생했는데 예측할만한 이유가 있었습니다.
1. 셋째줄부터 주어지는 입력값 1을 빈칸이지만 청소를 하지않는 곳으로 착각
2. 둘째줄 방향에대한 입력값 1을 서쪽으로 착각한 경우(0:북쪽 1:동쪽 2:남쪽 3:서쪽 저는 북에서 회전하면 서쪽이므로 1을 서쪽으로 착각했습니다)
3. 후진을 할경우 북쪽인 경우만 생각해서 좌표(행+1,열)으로 시작하는 경우(후진을 할때도 방향에따라 후진했을때 좌표값이 다릅니다)
저는 1 2 3을 동시에 착각해서.. 예제 2번 출력값이 20으로 나왔었습니다 다들 유의하세요!
->풀이한 코드
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | import java.util.*; import java.lang.*; import java.io.*; class Main { static int N; static int M; static int answer; static int[][] pan;//벽과 칸을 기록 static boolean[][] isChecked;//청소했는지 안했는지 여부 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); answer = 1; N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); pan = new int[N][M]; isChecked=new boolean[N][M]; st = new StringTokenizer(br.readLine()); int startX = Integer.parseInt(st.nextToken()); int startY = Integer.parseInt(st.nextToken()); int dir = Integer.parseInt(st.nextToken()); for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < M; j++) { pan[i][j] = Integer.parseInt(st.nextToken()); } } isChecked[startX][startY]=true; bfs(startX, startY, dir,0); System.out.println(answer); } public static void bfs(int x, int y, int dir, int temp) { if(temp==4){//다시 원점으로 왔을경우 후진할지 말지에 대한 판단 if(dir==0){ if(pan[x+1][y]==0){ if(!isChecked[x+1][y]){ isChecked[x+1][y] = true; answer++; } bfs(x+1,y,dir,0);//방향은 유지한채로 다시 시작 }else {return;}//후진이 안되면 종료 } else if(dir==1){ if(pan[x][y-1]==0){ if(!isChecked[x][y-1]){ isChecked[x][y-1] = true; answer++; } bfs(x,y-1,dir,0); }else {return;} } else if(dir==2){ if(pan[x-1][y]==0){ if(!isChecked[x-1][y]){ isChecked[x-1][y] = true; answer++; } bfs(x-1,y,dir,0); }else {return;} } else{ if(pan[x][y+1]==0){ if(!isChecked[x][y+1]){ isChecked[x][y+1] = true; answer++; } bfs(x,y+1,dir,0); }else {return;} } } else{ if (dir == 0) { if (isRange(x,y-1)&&!isChecked[x][y-1] && pan[x][y - 1] == 0) {// 빈칸이고 청소를안했으면 전진 isChecked[x][y-1] = true; answer++; bfs(x, y - 1, 3, 0);//북쪽에서 왼쪽회전하므로 } else if (isChecked[x][y-1] || pan[x][y - 1] > 0) { bfs(x, y, 3, temp + 1); } } else if (dir == 1) { if (isRange(x-1,y)&&!isChecked[x-1][y] && pan[x-1][y ] == 0) { isChecked[x-1][y] = true; answer++; bfs(x-1, y , 0, 0); } else if (isChecked[x-1][y] || pan[x-1][y] > 0) { bfs(x, y, 0, temp + 1); } } else if (dir == 2) { if (isRange(x,y+1)&&!isChecked[x][y+1] && pan[x][y + 1] == 0) { isChecked[x][y+1] = true; answer++; bfs(x, y + 1, 1, 0); } else if (isChecked[x][y+1] || pan[x][y + 1] > 0) { bfs(x, y, 1, temp + 1); } }else { if (isRange(x+1,y)&&!isChecked[x+1][y] && pan[x+1][y] == 0) { isChecked[x+1][y] = true; answer++; bfs(x+1, y , 2, 0); } else if (isChecked[x+1][y] || pan[x+1][y] > 0) { bfs(x, y, 2, temp + 1); } }} } public static boolean isRange(int x, int y) { return x >= 0 && x < N && y >= 0 && y < M; } } | cs |
728x90
반응형
'프로그래밍 > Break BOJ byJAVA' 카테고리의 다른 글
백준[JAVA] 1306번 달려라 홍준 (0) | 2023.02.23 |
---|---|
백준[JAVA] 9345번 디지털 비디오 디스크(DVDs) (0) | 2023.02.22 |
백준[JAVA] 2468번 안전 영역 (0) | 2022.12.29 |
백준[JAVA] 2420번 사파리월드 (0) | 2022.01.17 |
백준[JAVA] 2420번 사파리월드 (0) | 2022.01.17 |
Comments