※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25938번 문제인 Towers of Hanoi Grid이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/25938 

 

25938번: Towers of Hanoi Grid

The first input line contains a positive integer, g, indicating the number of grids to solve. The grids are on the following g input lines, one grid per line. Each grid is described by two integers d and n (2 ≤ d ≤ 100, 2 ≤ n ≤ 100), representing t

www.acmicpc.net

만약 모든 원판을 옮기는 데에 성공할 수 있다면, 모든 원판이 좌상단의 칸에서 우하단의 칸으로 이동한 것과 같으므로 총 이동횟수는 (가로-1) * (세로-1) * (원판의 개수)와 같게 된다. 따라서, 원판을 옮길 수 있는지 여부를 판단하기만 하면 문제를 해결할 수 있다.

 

원판 (N-1)*(N-1) + 1개가 있을 때, 먼저 (N-1)*(N-1)개를 우상단 꼭짓점을 포함하는 정사각형 모양으로 규칙적으로 적절히 이동시킨다면 좌상단에 하나 남은 원판을 좌변과 하변을 따라 우하단으로 옮긴 뒤 먼저 배치시킨 (N-1)*(N-1)개를 다시 순서대로 우하단으로 옮길 수 있다는 점을 관찰할 수 있다. (아래의 표와 같이 옮기는 것이 가능한 방법 중 하나이다.) 그러나 이보다 더 많은 원판이 있다면 작은 원판들로 길이 막혀 가장 큰 원판을 가장 먼저 우하단으로 옮길 수 없게 된다는 점을 관찰할 수 있다.

 

d=10, N=4 예시
10 3 2 1
  6 5 4
  9 8 7
       

 

위의 관찰을 기준삼아 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	for (int t = 1; t <= T; t++) {
		int d, N; cin >> d >> N;
		if (d > (N - 1) * (N - 1) + 1) cout << "Grid #" << t << ": impossible\n\n";
		else cout << "Grid #" << t << ": " << d * (N - 1) * 2 << '\n' << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 13909 // C++] 창문 닫기  (0) 2023.03.22
[BOJ 13908 // C++] 비밀번호  (0) 2023.03.21
[BOJ 25937 // C++] Balanced Strings  (0) 2023.03.19
[BOJ 25895 // C++] Don't Break the Ice  (0) 2023.03.18
[BOJ 27855 // C++] Cornhole  (0) 2023.03.17

+ Recent posts