본문 바로가기

ProgramSoliving

백준 : 1726

반응형

https://www.acmicpc.net/problem/1726

 

1726번: 로봇

많은 공장에서 로봇이 이용되고 있다. 우리 월드 공장의 로봇은 바라보는 방향으로 궤도를 따라 움직이며, 움직이는 방향은 동, 서, 남, 북 가운데 하나이다. 로봇의 이동을 제어하는 명령어는 다음과 같이 두 가지이다. 명령 1. Go k   - k는 1, 2 또는 3일 수 있다. 현재 향하고 있는 방향으로 k칸 만큼 움직인다. 명령 2. Turn dir   - dir은 left 또는 right 이며, 각각 왼쪽 또는 오른쪽으로 90° 회전한다. 공장 내 궤

www.acmicpc.net

BFS문제 실수하기 쉬웠던점은 1 2 3 이라는 go 명령어를 실행할때 앞에 1지점에서 막다른길이 있었을경우 2 3 명령은 실행 할수 없는점.

두번째 실수하기 쉬웠던점은 visit[][]처리문과 함께 벽이랑 묶어버려서 go 1 명령어 실행할때 방문햇으면 2 3을 실행하지 못하게 해놔서 정답이 안나올수 있음.
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
125
126
127
128
129
130
 
public class B1726 {
    static int N, M;
    static int map[][];
    static int dy[] = { 0001-1 };
    static int dx[] = { 01-100 };
    static class DIR{
        int left;
        int right;
        public DIR(int left, int right) {
            super();
            this.left = left;
            this.right = right;
        }
        
    }
    static DIR dir[] = new DIR[5];
    static class ROBOT {
        int y;
        int x;
        int d;
 
        public ROBOT(int y, int x, int d) {
            super();
            this.y = y;
            this.x = x;
            this.d = d;
        }
 
    }
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        
        dir[1= new DIR(4 ,3);
        dir[2= new DIR(3,4);
        dir[3= new DIR(1,2);
        dir[4= new DIR(2,1);
        map = new int[N + 1][M + 1];
 
        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= M; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
 
        boolean visit[][][] = new boolean[N + 1][M + 1][5];
 
        st = new StringTokenizer(br.readLine());
 
        Queue<ROBOT> q = new LinkedList<ROBOT>();
 
        int y = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());
 
        visit[y][x][d] = true;
        q.add(new ROBOT(y, x, d));
 
        st = new StringTokenizer(br.readLine());
 
        int ey = Integer.parseInt(st.nextToken());
        int ex = Integer.parseInt(st.nextToken());
        int ed = Integer.parseInt(st.nextToken());
 
 
        int order = 0;
        int Answer = -1;
 
        while (!q.isEmpty()) {
 
            int size = q.size();
 
            for (int s = 0; s < size; s++) {
                ROBOT tmp = q.poll();
                
                if(tmp.y ==ey && tmp.x ==ex &&tmp.d ==ed) {
                    Answer = order;
                    break;
                }
                
                //좌
                    y = tmp.y; x = tmp.x; d= dir[tmp.d].left;
                    if(!visit[y][x][d]) {
                        visit[y][x][d]= true;
                        q.add(new ROBOT(y, x, d));
                    }
                //우
                    y = tmp.y; x = tmp.x; d= dir[tmp.d].right;
                    if(!visit[y][x][d]) {
                        visit[y][x][d]= true;
                        q.add(new ROBOT(y, x, d));
                    }
                //go1~3
                    y = tmp.y; x = tmp.x; d= tmp.d;
                    for(int i=0;i<3;i++) {
                        y = y+dy[d]; x=x+dx[d];
                        if(y>=1&&y<=N&&x>=1&&x<=M&&!visit[y][x][d]&&map[y][x]==0) {
                            visit[y][x][d]= true;
                            q.add(new ROBOT(y, x, d));
                        }else if(y>=1&&y<=N&&x>=1&&x<=M&&visit[y][x][d]) {
                            continue;
                        }
                        else {
                            break;
                        }
                        
                    }
            }
            
            if(Answer !=-1break;
            
            order++;
        }
        
        System.out.println(Answer);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1194  (0) 2020.02.29
백준 : 1939  (0) 2020.02.29
백준 : 12844  (0) 2020.02.28
백준 : 1395 (JAVA)  (0) 2020.02.28
백준 : 109999 (JAVA)  (0) 2020.02.27