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>=l || 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 |