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



문제의 조건을 보면 이동할 수 있는 경로가 총 8개인 것을 알 수 있다.
시작지점에서부터 시작해서 y와 x좌표를 기준으로 총 8개의 방향으로 갈 수 있는지를 검사하여 

큐에 담아서 목표 지점에 도착할때까지 bfs를 실행하면 된다.



큐에 필요한 정보는 y좌표와 x좌표, 그리고 몇 번째로 검사하는지에 대한 시간 정보이다.


시간 정보는 아예 for문을 통해서 한 for문에서 큐에 있는 정보를 다 pop하고 

다른 큐에다가 다시 정보를 담는 방식으로 for문을 몇 번 실행했는지를 확인할 수 도 있지만,
3가지 정보를 담을 수 있는 형태로 큐에 해당 정보를 담아낼 수 있도록 하였다.



평소에는 구조체를 이용해서 큐에 구조체 타입으로 bfs를 종종 실행하였는데, 

이번에는 make_pair를 사용해서 해당 정보를 담아낼 수 있도록 하였다. 

그러나 정보가 2가지 이상일 때는 make_pair보다는 구조체를 이용하는게 훨씬 편리한 것 같다. 



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
#include <iostream>
#include <queue>
using namespace std;
 
//8개의 방향
int dy[8]={-1,-2,-2,-1,1,2,1,2};
int dx[8]={-2,-1,1,2,-2,-1,2,1};
 
int main(){
    int T,l,sx,sy,ex,ey; //l: 길이 sx,sy:시작 위치  ex,ey:목표 위치
    cin>>T;
    
    for(int testCase=0;testCase<T;testCase++){
        
        scanf("%d %d %d %d %d",&l,&sx,&sy,&ex,&ey);
        
        int visited[300][300]={0};
        
        queue<pair<int,pair<int,int>>> q;
        q.push(make_pair(0,make_pair(sy,sx))); //시간, y좌표, x좌표
        visited[sy][sx]++;
        
        while(!q.empty()){
            int y=q.front().second.first;
            int x=q.front().second.second;
            int cnt=q.front().first;
            q.pop();
            
            if(y==ey && x==ex){
                cout<<cnt<<endl;
                break;
            }
            
            for(int i=0;i<8;i++){
                int ny=y+dy[i];
                int nx=x+dx[i];
                
                if(ny<0 || ny>=|| nx<0 || nx>=l)
                    continue;
                
                if(visited[ny][nx])
                    continue;
                
                visited[ny][nx]++;
                q.push(make_pair(cnt+1,make_pair(ny,nx)));
            }
        }
        
    }
    
    return 0;
}
cs


'알고리즘(BOJ) > BFS' 카테고리의 다른 글

백준 2589번 - 보물섬  (0) 2018.01.30
백준 2644번 - 촌수계산  (0) 2018.01.28
백준 1389번 - 케빈 베이컨의 6단계 법칙  (0) 2018.01.28
백준 7576번 - 토마토  (0) 2018.01.28
백준 1697번 - 숨바꼭질  (0) 2018.01.28

+ Recent posts