dfs 洛谷 P1242 新漢諾塔

2022-09-18 01:06:10 字數 1334 閱讀 1365

題目描述

設有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個圓...