둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (223)
    • BOJ (176)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (31)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (14)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (1)
      • 분할 정복 (2)
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

7562번: 나이트 (BOJ C/C++)
BOJ/그래프

7562번: 나이트 (BOJ C/C++)

2022. 4. 20. 22:48

7562번: 나이트

사용 언어: C++

 

문제

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

입력

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

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

출력

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

 

풀이

그냥 BFS 문제인데 말의 이동 성향에 따라 dx와 dy를 조금 다르게 설정만 하면 된다!

#include <bits/stdc++.h>
#define X first
#define Y second
using namespace std;

int dx[8] = {2,1,-2,-1,2,1,-2,-1};
int dy[8] = {1,2,1,2,-1,-2,-1,-2};

int board[300][300];
int T, I, curx, cury, desx, desy;
queue<pair<int, int>> Q;

int main(void)
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> T;
	while(T--)
	{
		cin >> I >> curx >> cury >> desx >> desy;
		for(int i=0; i<I; i++)
			fill(board[i], board[i]+I, -1); //초기화
		Q.push({curx, cury});
		board[curx][cury] = 0;
		while(!Q.empty())
		{
			auto cur = Q.front(); Q.pop();
			for(int dir=0; dir<8; dir++)
			{
				int nx = cur.X + dx[dir];
				int ny = cur.Y + dy[dir];
				if(nx<0 || nx>=I || ny<0 || ny>=I) continue;
				if(board[nx][ny]>=0) continue;
				board[nx][ny] = board[cur.X][cur.Y] + 1;
				Q.push({nx, ny});
			}
		}
		cout << board[desx][desy] << '\n';
	}
	
	return 0;
}
저작자표시 (새창열림)

'BOJ > 그래프' 카테고리의 다른 글

2583번: 영역 구하기 (BOJ C/C++)  (0) 2022.07.25
5427번: 불 (BOJ C/C++)  (0) 2022.07.25
7569번: 토마토 (BOJ C/C++)  (0) 2022.04.04
10026번: 적록색약 (BOJ C/C++)  (0) 2022.03.29
1697번: 숨바꼭질 (BOJ C/C++)  (0) 2022.03.29
    'BOJ/그래프' 카테고리의 다른 글
    • 2583번: 영역 구하기 (BOJ C/C++)
    • 5427번: 불 (BOJ C/C++)
    • 7569번: 토마토 (BOJ C/C++)
    • 10026번: 적록색약 (BOJ C/C++)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바