반응형
https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
문제 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까? 입력 입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ...
www.acmicpc.net
기존의 2차원 좌표에서 BFS, DFS를 할 때 상하좌우 좌표에서 확장하여 생각할 수 있다.
위의 그림과 같이 체스 위의 나이트는 총 8가지 경우의 수로 좌표 이동이 가능하다.
이 점을 염두에 두고, const dy[], const dx[] 좌표를 8개 고정으로 박아둔 뒤, 순회해주면서 탐색하면 된다.
+
//cost[][]를 도입하여, 시작지점 i, j의 cost[i][j] = 0으로 하고, 다른 좌표의 cost를 인접우선탐색하면서
// +1 씩 해준다. 이때 우리가 이동하고자 하는 좌표 (k,l)의 cost[k][l] 에 마킹되는 값이 답이 된다
[구현코드]
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
vector<vector<int>> cost;
int y1,y2,x1,x2;
const int dy[] = {1,2,2,1,-1,-2,-2,-1};
const int dx[] = {-2,-1,1,2,2,1,-1,-2};
int I; // M은 가로, N은 세로를 의미
void bfs( int y1, int x1, int y2, int x2){
queue<pair<int, int>> q;
q.push(make_pair(y1,x1));
while(!q.empty()){
pair<int,int> here = q.front();
if(y1 == y2 && x1 == x2){
break;
}
q.pop();
for(int m = 0; m < 8; m++){
int next_y = here.first + dy[m];
int next_x = here.second + dx[m];
if(next_y >= 0 && next_y < I
&& next_x >= 0 && next_x < I
&& cost[next_y][next_x] == 0){
cost[next_y][next_x] = 1 + cost[here.first][here.second];
q.push(make_pair(next_y,next_x));
}
}
}
}
int main(){
int T;
cin>>T;
while(T--){
cin>>I;
cost.clear();
cost.resize(I,vector<int>(I,0));
cin>>y1>>x1;
cin>>y2>>x2;
bfs(y1, x1, y2, x2);
cout<<cost[y2][x2]<<'\n';
}
return 0;
}
반응형
'알고리즘_개념 및 문제풀이 ' 카테고리의 다른 글
프로그래머스/고득점키트/해시/완주하지못한선수 (0) | 2019.05.07 |
---|---|
프로그래머스/고득점키트/BFS/DFS/단어변환 (0) | 2019.05.07 |
백준온라인저지(BOJ)/#7576/BFS/토마토 (0) | 2019.05.06 |
백준온라인저지(BOJ)/#2644/촌수계산/BFS (0) | 2019.05.06 |
프로그래머스/고득점문제키트/탐욕법(Greedy)/구명보트 (0) | 2019.05.06 |