漢諾塔公升級了
現在我們有n個圓盤和n個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,n個柱子從左向右排成一排。每次你可以將乙個柱子的最上面的圓盤移動到右邊或者左邊的柱子上(如果移動是合法的話)。現在告訴你初始時的狀態,你希望用最少的步數將第i大的盤子移動到第i根柱子上,問最小步數。
輸入格式:
第一行乙個整數t,代表詢問的組數。
接下來t組資料,每組資料第一行乙個整數n。
接下來一行n個正整數,代表每個柱子上圓盤的大小。
輸出格式:
輸出共t行,代表每次的答案。如果方案不存在,輸出-1;
輸入樣例#1:
432 1 3
27 8
210000 1000
397 96 95
輸出樣例#1:
40-120
對於70%的資料,n的值都是相等的。
對於100%的資料,1≤t≤6 x 10^3 ; 1≤n≤7。
其實這個題其實是打表啊…..用bfs打表,然後對應詢問直接輸出,時空複雜度大丈夫。
對於讀入進來的資料,離散化一下,用z陣列記錄這個盤子是第幾大。
用bit陣列記錄位,這個是當你移動盤子的時候有用的….(具體我也說不太清楚,看**理解理解吧。)
我們開乙個top和place陣列,分別記錄第i個柱子的最上面的盤子,和當前盤子在哪根柱子上,
預處da理biao的時候,首先從初始狀態開始搜(1,12,123,1234……1234567)
每搜到乙個新的可能狀態,就把這個狀態記錄下來。(試想一下,從某個給定狀態到初始狀態的步數==從初始狀態的步數到給定狀態的步數)
細節處理的話,直接看**吧。
#include#include#include
#include
using
namespace
std;
const
int maxn=10000000
;int n,top[10],place[10],bit[10];//
最上面|每個盤子位置 |進製儲存
int res[maxn];//
答案int q[maxn];//
佇列 int front,tail;//
佇列頭尾指標
int w[10],z[10];//
z為離散化後的大小
bool
use[maxn];
bool cmp(int a,int
b)//
按大小排序
void analyze(int
s) reverse(place+1,place+x+1);//
逆轉 (乙個奇怪的函式)
for (int a=x;a>=1;a--)
top[place[a]]=a;
//初始最上面位置 即1 2 3 4 5 6 7
for (int a=1;a<=x;a++)
}//左移
if (p!=x && (a1] || !top[p+1
]))
}//右移
} }
}int
main()
//bit 10 100 1000 10000...
for(;front<=tail;)
printf("%d
",tail);
intt;
scanf("%d
",&t);
for(;t--;)
return0;
}
python 漢諾塔 Python漢諾塔
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...
漢諾塔公升級版(搜尋)
題目描述 漢諾塔公升級了 現在我們有?個圓盤和?個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,個柱子從左到右排成一排。每次你可以將乙個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上 如果移動之後是合法的話 現在告訴你初始時的狀態,你希望用最少的步數將第?大的盤子移動到第?根柱子上,問最...
漢諾塔合集之漢諾塔3
漢諾塔3 步驟分析 1.當只有乙個圓盤時,要從a到b再到c 2.同樣擴充套件經典漢諾塔問題來看,先把a柱上 n 1 個圓盤,經b移動到c 3.把最後乙個圓盤從a移動到b 4.把c柱上的 n 1 個圓盤,經b移動 移回 到a 5.把b上的最後乙個圓盤從b移到c 6.最後把a上的 n 1 個圓盤經過b移...