[백준 7562번 C/C++] 나이트의 이동
[백준 7562번 C/C++] 나이트의 이동

https://www.acmicpc.net/problem/7562
7562번: 나이트의 이동
체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수
www.acmicpc.net
해결전략
너비우선 탐색, BFS
코드
#include <iostream> #include <queue> #include <vector> #include <cstring> // 메모리를 설정하는 함수들을 사용하기 위한 라이브러리 (예: memset) using namespace std; int t, n; // t: 테스트 케이스의 수, n: 체스판 한 변의 길이 int c, d; // 도착 위치 (c,d) int ch[301][301]; // 각 위치에 대해 방문 여부 및 이동 횟수를 저장하는 배열 queue<pair<int,int>> Q; // BFS에서 사용할 큐. 각 pair는 (y,x) 좌표를 나타냅니다. // 나이트가 움직일 수 있는 8가지 방향을 정의한 배열 int dirY[8] = { -1, -2, -1, -2, 1, 2, 1, 2 }; int dirX[8] = { -2,-1 ,2 ,1 ,-2,-1 ,2 ,1 }; // BFS 함수 정의. 시작점 (a,b)를 인자로 받습니다. void BFS(int a,int b) { memset(ch,-1,sizeof(ch)); // 모든 위치에 대해 방문 여부 및 이동 횟수 초기화 Q.push(make_pair(a,b)); // 시작점을 큐에 넣음 ch[a][b] = 0; // 시작점에서의 이동 횟수는 0 while(!Q.empty()) // 큐가 비어있지 않은 동안 반복 { int y=Q.front().first; int x=Q.front().second; Q.pop(); if(y==c && x==d){ // 현재 위치가 도착점과 같으면, cout << ch[c][d] << "\n"; // 해당 위치까지의 최소 이동 횟수 출력하고 함수 종료. return; } for(int i=0;i<8;i++) // 모든 가능한 방향에 대해, { int ny=y+dirY[i]; int nx=x+dirX[i]; if(0<=ny && ny<n && 0<=nx && nx<n && ch[ny][nx]==-1) // 아직 방문하지 않았고, 체스판 범위 내에 있는 경우 { Q.push(make_pair(ny,nx)); // 그 위치를 큐에 넣고, ch[ny][nx]=ch[y][x]+1; // 시작점에서 해당 위치까지의 이동 횟수를 저장. } } } return; } int main(){ ios::sync_with_stdio(false); // 입출력 속도 향상을 위한 설정 cin.tie(NULL); cout.tie(NULL); cin >> t; // 테스트 케이스의 수 입력 while(t--) // 각 테스트 케이스에 대해, { cin >> n; // 체스판 한 변의 길이 입력 int a, b; cin >> a >> b; // 시작점 (a,b) 입력 cin >> c >> d; // 도착점 (c,d) 입력 BFS(a, b); // BFS 함수 호출 while(!Q.empty()) { Q.pop(); // 다음 테스트 케이스를 위해 큐 초기화 } } return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 2667번 C/C++] 단지 번호 붙이기 (0) | 2023.09.24 |
---|---|
[백준 2206번 C/C++] 벽 부수고 이동하기 (0) | 2023.09.20 |
[백준 1697번 C/C++] 숨바꼭질 (0) | 2023.08.31 |
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2 (0) | 2023.08.29 |
[백준 2580번 C/C++] 스도쿠 (0) | 2023.08.20 |
댓글
이 글 공유하기
다른 글
-
[백준 2667번 C/C++] 단지 번호 붙이기
[백준 2667번 C/C++] 단지 번호 붙이기
2023.09.24 -
[백준 2206번 C/C++] 벽 부수고 이동하기
[백준 2206번 C/C++] 벽 부수고 이동하기
2023.09.20 -
[백준 1697번 C/C++] 숨바꼭질
[백준 1697번 C/C++] 숨바꼭질
2023.08.31 -
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2
2023.08.29
댓글을 사용할 수 없습니다.