반응형
https://www.acmicpc.net/problem/7562
문제
체스판 위에 한 나이트가 놓여져 있다.
나이트가 한 번에 초록색 칸으로 이동할 수 있다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?
입력
입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.
각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l 이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄에는 나이트가 현재 있는 칸, 셋째 줄에는 나이트가 이동하려고 하는 칸이 주어진다.
출력
각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.
풀이
이는 BFS를 이용하여 경우의수를 살펴보면된다.
현재 나이트의 위치를 처음 Q에 넣고 해당 위치에서 나이트가 이동할수있는 8가지 경우의 수를 모두 살핀다.
몇 번 이동했는지도 생각해야하기 때문에 말의 위치를 pair 로 저장하고 말의 위치와 횟수를 또 pair로 저장한다.
한번 확인한 칸은 다시 확인할 필요없으므로 check 배열을 두고 확인여부를 작성한다.
코드
#include <iostream>
#include <queue>
using namespace std;
int main(){
cin.tie(0);
ios_base::sync_with_stdio(false);
int n=0; //반복횟수
cin>>n;
int w, x, y, fx, fy;
int dx[8] = {2,2,-2,-2, 1,-1,1,-1};
int dy[8] = {1,-1,1,-1, 2,2,-2,-2};
for(int i=0; i<n;i++){ //테이스케이스
//cout<<i<<"번 째"<<endl; //test
queue<pair<int, pair<int, int> > > Q;
cin>>w>>x>>y>>fx>>fy;
int** check = new int*[w];
for(int x=0;x<w;x++){
check[x]= new int[w];
}
for (int a = 0; a < w; a++) {
for (int b = 0; b < w; b++) {
check[a][b] = 0;
}
}
int num=0; //반복횟수
Q.push(make_pair(num, make_pair(x,y)));
check[x][y]=1;
int flag=1;
while(flag){ //BFS
pair<int, int> temp = Q.front().second;
if(temp.first==fx && temp.second==fy){
cout<<Q.front().first<<"\\n";
flag=0;
break;
}
//cout<<"pop : ( "<<temp.first<<", "<<temp.second<<" ) "<<Q.front().first<<"\\n";
int front_num=Q.front().first;
Q.pop();
num++;
for(int a=0;a<8;a++){
int temp_x = temp.first+dx[a];
int temp_y = temp.second+dy[a];
if(temp_x<0 || temp_x >=w || temp_y<0 || temp_y>=w){
continue;
}else{
//cout<<"push : ( "<<temp_x<<", "<<temp_y<<" ) "<<num<<"\\n";
if(check[temp_x][temp_y]!=1){
Q.push(make_pair(front_num+1, make_pair(temp_x, temp_y)));
check[temp_x][temp_y]=1;
}
}
}
}
}
return 0;
}
반응형
'BOJ > [ BOJ ] C++' 카테고리의 다른 글
[ C++ ] #1780 종이의 개수 (실버 II) (1) | 2024.01.08 |
---|---|
[ C++ ] #5427 불 (골드 IV) (1) | 2024.01.08 |
[ C++ ] #2493 탑 (골드V) (2) | 2023.12.27 |
[ C++ ] #1874 스택수열 ( 실버 II ) (1) | 2023.12.26 |
[ C++ ] #15649 N과 M (0) | 2023.03.06 |