째로탈출 1과 2는 사실 같은 문제이지만.. 뭐..

그 중에서.. 어렵다면 2번이 더 어렵겠죠????

최적화해서 풀기도 했지만.. 이번에 올릴 코드는

최적화된 코드는아닙니다!

동서남북으로 각각 이동했다면 각각으로는 다시 이동하지 않게 만들면 최적화가 되겠지요???


문제 푸는 요령은... 공이 파랑, 빨강이 있습니다.. 이 문제는 우선순위만 판단할 수 있다면 그리 어려운 문제는 아니라고 생각합니다.

파랑과 빨강이 같은 행이나 열에 있는데.. 행이면 왼쪽, 오른쪽 열이면 위 아래로 움직일 때 우선순위를 판별해서 공의 위치만 정할 수 있으면

간단하게 해결할 수 있습니다. 공이 움직이는 함수는 move()입니다. 우선순위를 판별하는 함수는 priority_inspect입니다.

그냥 공이 한개라고생각하고 밀고나서 두 공의 위치가 같을 경우!!!! 우선순위를 판별하여 적절한 위치에 공을 놓으면 끝입니다!!!!!



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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
 
#define MAX_SIZE 11
#define INF 0x7fffffff
using namespace std;
 
char map[MAX_SIZE][MAX_SIZE];
int m, n;
int bx, by;
int rx, ry;
 
int dx[4= { -1100 };
int dy[4= { 00-11 };
 
void input(){
    scanf("%d %d"&m, &n);
    getchar();
 
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            map[i][j] = getchar();
            if (map[i][j] == 'B'){
                bx = i;
                by = j;
            }
            else if (map[i][j] == 'R'){
                rx = i;
                ry = j;
            }
        }
        getchar();
    }
}
 
void print(){
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            printf("%c", map[i][j]);
        }
        puts("");
    }
    puts("");
}
 
bool priority_inspect(int d){//레드가 높으면 1 아니면 0
    switch (d){
    case 0:
        if (rx < bx) return 1;
        else return 0;
        break;
    case 1:
        if (rx > bx) return 1;
        else return 0;
        break;
    case 2:
        if (ry < by) return 1;
        else return 0;
        break;
    case 3:
        if (ry > by) return 1;
        else return 0;
        break;
    }
}
 
int move(int d){//위 아래 왼 오
 
    bool red_zero = 0, blue_zero = 0;
    bool red_stop = 0, blue_stop = 0;
    bool red_prio = priority_inspect(d);
    int nrx;
    int nry;
    int nbx;
    int nby;
 
    //둘다 못움직일 때 까지 와일
    while (!blue_stop || !red_stop){
 
        if (!red_stop){
            nrx = rx + dx[d];
            nry = ry + dy[d];
 
            if (nrx < 0 || nry < 0 || nrx >= m || nry >= n || map[nrx][nry] == '#') red_stop = 1;
            else if (map[nrx][nry] == 'O'){
                red_stop = 1;
                red_zero = 1;
            }
            else{
                rx = nrx;
                ry = nry;
            }
        }
 
        if (!blue_stop){
            nbx = bx + dx[d];
            nby = by + dy[d];
 
            if (nbx < 0 || nby < 0 || nbx >= m || nby >= n || map[nbx][nby] == '#') blue_stop = 1;
            else if (map[nbx][nby] == 'O'){
                blue_stop = 1;
                blue_zero = 1;
            }
            else{
                bx = nbx;
                by = nby;
            }
        }
    }
 
    //공의 위치가 같을 때
    if (rx == bx && ry == by){
        if (d == 0){
            if (red_prio) bx++;
            else rx++;
        }
        else if (d == 1) {
            if (red_prio) bx--;
            else rx--;
        }
        else if (d == 2) {
            if (red_prio) by++;
            else ry++;
        }
        else {
            if (red_prio) by--;
            else ry--;
        }
    }
 
    if (blue_zero) return 0// 블루 제로 들어감
    else if (red_zero) return 1// 레드 제로 들어감
    else return 2// 제로 발견 못함
}
 
int dfs(int d){//깊이
    if (d == 10return INF;
 
    int brx = rx;
    int bry = ry;
    int bbx = bx;
    int bby = by;
    int ret = INF;
 
    for (int i = 0; i < 4; i++){
        int tmp = move(i);
 
        if (tmp == 1return d + 1;
        else if (tmp == 2){
            int tmp2 = dfs(d + 1);
            if (ret > tmp2) ret = tmp2;
        }
 
        rx = brx;
        ry = bry;
        bx = bbx;
        by = bby;
    }
 
    return ret;
}
 
 
int main(){
    //freopen("input.txt", "r", stdin);
    //setbuf(stdout, NULL);
 
    //int t;
    //scanf("%d", &t);
 
    //while (t--){
 
    input();
    int ret = dfs(0);
    printf("%d\n", ret == INF ? -1 : ret);
 
    //}
 
    return 0;
}
cs


'알고리즘 > 탐색' 카테고리의 다른 글

[3055] 탈출  (0) 2017.04.16
[5427] 불  (0) 2017.04.16
[12100] 2048 easy  (0) 2017.04.16
[5214] 환승  (0) 2017.04.04
[9009] 피보나치  (0) 2017.04.04

+ Recent posts