한 노 타의 비 귀속 실현 (25 점)

한 노 타의 비 귀속 실현 (25 점)
스 택 을 통 해 한 노 타 워 의 문제 (n, a, b, c) 를 비 재 귀 (순환) 방식 으로 풀 고 N 개의 접 시 를 시작 기둥 (a 로 표시) 에서 기둥 (b 로 표시) 을 통 해 목표 기둥 (c 로 표시) 으로 이동 시 키 며 모든 이동 이 한 노 타 문제 의 요구 에 부합 하도록 확보한다.
입력 형식: 시작 기둥 의 디스크 수 를 정수 N 으로 입력 하 십시오.
출력 형식: 각 작업 (이동) 이 한 줄 을 차지 하고 기둥 1 - > 기둥 2 의 형식 으로 출력 합 니 다.
입력 예시: 3
출력 샘플: a - > c a - > b c - > b a - > c b - > a b - > c a - > c c
재 귀적 으로 실현 되 지 않 으 면 창고 에 써 야 한다.창 고 는 후진 이 먼저 나온다.이 문제 의 사고: 간단 한 몇 개의 탑 을 먼저 이동 하 는 방법 은 모두 같은 도해 블 로그 이다.
#include
#include 
using namespace std;
char han[4] = { '0','a','b','c' };
stack<int> a[4];
bool move(int last, int next) {
	if (a[last].empty())
		return false;
	if (!a[next].empty())
		if ((a[next].top() - a[last].top()) < 0)
			return false;
	a[next].push(a[last].top());
	a[last].pop();
	printf("%c -> %c
"
, han[last], han[next]); return true; } int main() { int N, count = 0; cin >> N; for (int i = 0; i < N; i++) a[1].push(N - i); if (N % 2 == 1) { han[2] = 'c'; han[3] = 'b'; } while (++count) { move((count - 1) % 3 + 1, (count) % 3 + 1); if (!move((count - 1) % 3 + 1, (count + 1) % 3 + 1)&&!move((count + 1) % 3 + 1, (count - 1) % 3 + 1)) break; } }

좋은 웹페이지 즐겨찾기