題目描述
設有n個大小不等的中空圓盤,按從小到大的順序從1到n編號。將這n個圓盤任意的迭套在三根立柱上,立柱的編號分別為a、b、c,這個狀態稱為初始狀態。
現在要求找到一種步數最少的移動方案,使得從初始狀態轉變為目標狀態。
移動時有如下要求:
·一次只能移乙個盤;
·不允許把**移到小盤上面。
輸入輸出格式
輸入格式:
檔案第一行是狀態中圓盤總數;
第二到第四行分別是初始狀態中a、b、c柱上圓盤的個數和從上到下每個圓盤的編號;
第五到第七行分別是目標狀態中a、b、c柱上圓盤的個數和從上到下每個圓盤的編號。
輸出格式:
每行一步移動方案,格式為:move i from p to q
最後一行輸出最少的步數。
輸入輸出樣例
輸入樣例#1:
5 3 3 2 1
2 5 4
0 1 2
3 5 4 3
1 1
輸出樣例#1:
move 1 from a to b
move 2 from a to c
move 1 from b to c
move 3 from a to b
move 1 from c to b
move 2 from c to a
move 1 from b to c
7 說明
圓盤總數≤45
首先要將第n個盤子從x到y
那麼就要把比n小的盤子全部移到6-x-y
然後將n移到y
#include
#include
#include
using
namespace
std;
int a[101],b[101],n;
long
long ans;
void dfs(int x,int dep)
int main()
cin>>x;
for (int i=1;i<=x;i++)
cin>>x;
for (int i=1;i<=x;i++)
cin>>x;
for (int i=1;i<=x;i++)
cin>>x;
for (int i=1;i<=x;i++)
cin>>x;
for (int i=1;i<=x;i++)
for (int i=n;i>=1;i--) dfs(i,b[i]);
cout
<}
洛谷P1242 新漢諾塔
首先要將第n個盤子從x到y,那麼就要把比n小的盤子全部移到6 x y,然後將n移到y 仔細想想 6代表的是3根初始柱,3根目標柱。6 x y 便是我們的中轉柱了,因為到這個位置是最優的。感覺題目有鍋啊。include include include include using namespace s...
洛谷 4285 SHOI 漢諾塔
這道題我到現在也沒有全懂,只能大概理解一下思路 首先g x i 表示當執行到i層x最優到g x i 裡去 f x i 表示當執行到i層從x到g x i 需要的步數 很明顯i 和 i 1是存在遞推關係的 設g x i 1 y,表示上一次最優x到y,如果上一次最優g y i 1 是到z的話,先把最後乙個...
洛谷 P1760 通天之漢諾塔
直達通天路 小a歷險記第四篇 在你的幫助下,小a成功收集到了寶貴的資料,他終於來到了傳說中連線通天路的通天山。但是這距離通天路仍然有一段距離,但是小a突然發現他沒有地圖!但是幸運的是,他在山腳下發現了乙個寶箱。根據經驗判斷 小a有經驗嗎?地圖應該就在其中!在寶箱上,有三根柱子以及在一根柱子上的n個圓...