https://www.acmicpc.net/problem/17267
17267번: 상남자
CTP의 대표 상남자 영조는 자유롭게 이동하는 것을 좋아한다. 그렇지만 영조는 상남자이기 때문에 위아래로만 간다. 따라서 위, 아래로는 얼마든지 이동할 수 있지만 왼쪽, 오른쪽으로는 이동하
www.acmicpc.net
처음에는 BFS로 단순히 탐색해서 예제가 다 맞길래 제출해봤더니 틀렸습니다!
문제점이 세가지 있었다.
첫번째는 queue가 아닌 deque로 풀어야 한다는 것.
두번째는 오른쪽 왼쪽으로 갈 때 원래의 점 정보의 L, R 값을 함부로 줄이면 안된다는 점
마지막으로 x, y 방향 문제 (이건 아직도 헷갈린다 디버깅해서 겨우 적응)
첫번째 문제는
https://www.acmicpc.net/board/view/37868
글 읽기 - BFS문제. 맞았는데 왜 맞는거죠?!
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
(여기서 대단한 분이 기가막힌 반례를 주셨기 때문에)
상하좌우로 1칸씩 이동하면 못가게되는 곳이 생겨서, 문제처럼 최대한 상하좌우로 움직일 수 있게 queue가 아닌 deque로 짜야한다.
deque로 상하로 최대한 움직일 수 있게 로 앞쪽에 삽입하고, deque.push_front()
좌우로 움직이는 것은 큐 뒤쪽에 삽입한다. deque.push_back()
두번째 문제는
if (i==3) {
if (left>0) p = {nx, ny, left -1, right};
else continue;
}
else if (i==1) {
if (right>0) p = {nx, ny, left, right - 1};
else continue;
}
else {
p = {nx, ny, left, right};
}
이 부분에서 처음엔
left--;
right--;
으로 줄인값을 넣었더니 다음 for문을 돌 때, 왼쪽 오른쪽을 가지 않았는데도 값이 줄어서 전달되기 때문에 잘못되었다.
전체코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
using namespace std;
struct pos{
int x;
int y;
int left;
int right;
};
int N, M, L, R, sx, sy, cnt;
int map[1000][1000];
bool visit[1000][1000];
deque<pos> q;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int main(int argc, const char * argv[]) {
string input;
cin >> N >> M >> L >> R;
for (int i=N-1; i>=0; i--) {
cin >> input;
for (int j=0; j<M; j++) {
map[j][i] = input[j] - '0';
if (map[j][i] == 2) {
sx = j;
sy = i;
}
}
}
pos p = {sx, sy, L, R};
q.push_back(p);
visit[sx][sy] = true;
while(!q.empty()) {
int x = q.front().x;
int y = q.front().y;
int left = q.front().left;
int right = q.front().right;
q.pop_front();
for (int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (0<=nx && nx<M && 0<=ny && ny<N && map[nx][ny] != 1 && !visit[nx][ny]) {
if (i==3) {
if (left>0) p = {nx, ny, left -1, right};
else continue;
}
else if (i==1) {
if (right>0) p = {nx, ny, left, right - 1};
else continue;
}
else {
p = {nx, ny, left, right};
}
if (i==0 || i==2) {
q.push_front(p);
}
else if (i==1 || i==3) {
q.push_back(p);
}
visit[nx][ny] = true;
}
}
}
for (int i=0; i<M; i++) {
for (int j=0; j<N; j++) {
if (visit[i][j]) {
cnt++;
}
}
}
cout << cnt << "\n";
return 0;
}
주저리..
맥북 디버깅 완전 적응했다 이문제로...ㅎㅎ
deque는 디큐인가 덱인가 데큐인가
'ALGORITHM > DFS, BFS' 카테고리의 다른 글
14889 스타트와 링크 (0) | 2021.01.16 |
---|---|
9663 N-Queen (0) | 2021.01.16 |
15649 N과 M (1) (0) | 2021.01.12 |
11578 팀원 모집 (0) | 2020.12.26 |
11581 구호물자 (3) | 2020.12.25 |