반응형
** 해결안된 부분 >>
블루나 레드 구슬 탈출 후 바로 리턴해주었다 >>
첫번째에서 블루,레드부분이 탈출했을때 return 을 하게 되면 solve함수를 탈출해버려 나머지 for문이 돌지 못한다.
continue로 바꿔주었더니 풀림 ... ㅎ
나는 continue를 써야하는데 이상하게 for문을 추가해줘서 ... 이상하게 풀었다
continue , return 에 차이를 알고 잘쓰자!
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int dy[4] = { 1, 0, -1, 0 };
int dx[4] = { 0, 1, 0, -1 };
int N, M;
char map[12][12];
int ans = 11;
int rx, ry, bx, by,ox,oy;
int visited[12][12][12][12];
pair<int, int> go(int x, int y,int dir) {
int nx = x; int ny = y;
while (true) {
nx = dx[dir] + nx;
ny = dy[dir] + ny;
if (map[nx][ny] == '#') {
return{ nx- dx[dir],ny- dy[dir] };
}
else if (map[nx][ny] == 'O') {
return{ nx,ny };
}
}
return { nx,ny };
}
void solve(int rex, int rey, int bex, int bey,int depth) {
if (depth == 10) {
return;
}
for (int i = 0; i < 4; i++) {
pair<int, int> blue = go(bex, bey, i);
pair<int, int> red = go(rex, rey, i);
if (red.first == ox && red.second == oy) {
if (blue.first == ox && blue.second == oy) {
continue;
}
else {
ans = (ans > depth + 1 ? depth + 1 : ans);
}
return;
}
else if (blue.first == ox && blue.second == oy) continue;
if (red.first == blue.first && red.second == blue.second) {
switch (i) {
case 0:
if (rey > bey) blue.second = blue.second - 1;
else red.second = red.second - 1;
break;
case 1:
if (rex < bex) red.first = red.first - 1;
else blue.first = blue.first - 1;
break;
case 2:
if (rey > bey) red.second = red.second + 1;
else blue.second = blue.second + 1;
break;
case 3:
if (rex< bex) blue.first = blue.first + 1;
else red.first = red.first + 1;
break;
}
}
if (visited[red.first][red.second][blue.first][blue.second] == 1 ) continue;
visited[red.first][red.second][blue.first][blue.second] = 1;
solve(red.first, red.second, blue.first, blue.second, depth + 1);
visited[red.first][red.second][blue.first][blue.second] = 0;
}
}
int main() {
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++) {
scanf("%s", map[i]);
for (int j = 0; j < M; j++) {
if (map[i][j] == 'B') bx = i, by = j;
else if (map[i][j] == 'R') rx = i, ry = j;
else if (map[i][j] == 'O') ox = i, oy = j;
}
}
visited[rx][ry][bx][by] = 1;
// for (int i = 0; i < 4; i++) {
solve(rx, ry, bx, by, 0);
// }
if (ans > 10) printf("%d", -1);
else printf("%d", ans);
}
반응형
'CS > 알고리즘' 카테고리의 다른 글
백준 17837 새로운 게임2 (0) | 2020.03.05 |
---|---|
백준 17779 게리맨더링2 (0) | 2020.03.04 |
백준 1986 체스 (0) | 2020.02.11 |
백준 5397 키로거 (0) | 2020.02.10 |
백준 3098 소셜네트워크 (0) | 2020.02.10 |