# Recursion# Divide and Conquer

h089 - 疊披薩

🔗 前往 ZeroJudge 原題

題目描述

題目描述了將 N 片由上往下尺寸遞增的披薩從 A 盒子移動到 C 盒子,過程中只能一次移動最上面的披薩,且避免披薩互相碰撞或打翻。要求輸出移動披薩的步驟,以最少步數完成移動。

解題思路

這道題是經典的漢諾塔問題。漢諾塔問題的解法是遞迴的。將 N 片披薩從 A 移動到 C,可以分解為以下三個步驟:

  1. 將 N-1 片披薩從 A 移動到 B (借助 C)。
  2. 將第 N 片披薩從 A 移動到 C。
  3. 將 N-1 片披薩從 B 移動到 C (借助 A)。

遞迴的終止條件是當 N 等於 1 時,直接將披薩從 A 移動到 C。

複雜度分析

  • 時間複雜度: O(2^N)
  • 空間複雜度: O(N)

程式碼

#include <iostream>
using namespace std;
void Towers(int n,char a,char b,char c){
	if(n==1){
		cout<<"from "<<a<<" to "<<c<<'\n';
	}
	else{
		Towers(n-1,a,c,b);
		cout<<"from "<<a<<" to "<<c<<'\n';
		Towers(n-1,b,a,c);
	}
}
int main() {
	cin.tie(0);cout.tie(0); ios::sync_with_stdio(false);
	int n;
	cin>>n;
	Towers(n,'A','B','C');
}

Discussion