ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 나이트의 이동 C++
    백준 algorithm 2022. 4. 13. 23:12
    반응형

     

     

    입력

    입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

    각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

    출력

    각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

    예제 입력 1 복사

    3
    8
    0 0
    7 0
    100
    0 0
    30 50
    10
    1 1
    1 1

     

     

    => 간단한 BFS문제입니다. 

    => BFS로 탐색을 하며 target 좌표를 찾았을 경우 해당 값까지 이동한 거리를 출력하면 됩니다. 

    => BFS를 사용하기 때문에 queue를 사용해야하며 좌표를 표현하기 위해 pair형 자료구조를 활용하였습니다. 

    => 움직일 수 있는 위치를 계산하기 위해 dx[8] , dy[8] 배열을 이용하여 계산하였습니다. 

    => 자세한 풀이는 아래의 그림을 통해 확인할 수 있습니다. 

     

     

     

    #include <string>
    #include <algorithm>
    #include <set>
    #include <map>
    #include <unordered_map>
    #include <unordered_set>
    #include <iostream>
    #include <queue>
    #include <utility>
    
    using namespace std;
    
    pair<int, int> cur, target;
    int arr     [301][301];
    int visited[301][301];
    int dx[8] = { -2,-1,1,2,2,1,-1,-2 };
    int dy[8] = { 1,2,2,1,-1,-2,-2,-1 };
    queue<pair<int, int>> Q;
    int M, D;
    
    void reset()
    {
    	while (!Q.empty()) Q.pop();
    	for (int i = 0; i < 301; i++)
    	{
    		for (int j = 0; j < 301; j++)
    		{
    			visited[i][j] = 0;
    			arr[i][j] = 0;
    		}
    	}
    }
    void BFS(int x, int y)
    {
    	Q.push(make_pair(x,y));
    	visited[x][y] = true; 
    	while (!Q.empty())
    	{
    		int QX = Q.front().first;
    		int QY = Q.front().second;
    
    		Q.pop();
    
    		if ((QX == target.first) && (QY == target.second))
    		{
    			cout << arr[QX][QY] << '\n';
    			while (!Q.empty())Q.pop();
    			break;
    		}
    
    		for (int i = 0; i < 8; i++)
    		{
    			int nx = QX + dx[i];
    			int ny = QY + dy[i];
    
    			if ((nx >= 0) && (ny >= 0) && (nx < D) && (ny < D) && !visited[nx][ny])
    			{
    				Q.push(make_pair(nx, ny));
    				visited[nx][ny] = true; 
    				arr[nx][ny] = arr[QX][QY] + 1;
    
    			}
    
    		}
    	}
    
    
    }
    
    int main()
    { 
    	ios_base::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0); 
    	
    	 
    	cin >> M; 
    	for (int i = 0; i < M; i++)
    	{
    		cin >> D;
    		cin >> cur.first >> cur.second;
    		cin >> target.first >> target.second;
    
    		BFS(cur.first, cur.second);
    		reset();
    	}
    
    
    	return 0;
    }

    반응형

    '백준 algorithm' 카테고리의 다른 글

    백준 11866 요세푸스 문제 0 C++  (0) 2022.07.17
    백준 2747 피보나치수 C++  (0) 2022.04.26
    백준 2525 오븐시계 C++  (0) 2022.04.12
    백준 11286 - 절댓값 힙  (0) 2022.04.09
    백준 1927 - 최소 힙  (0) 2022.04.06

    댓글

Designed by Who.