題目描述:
漢諾塔公升級了:現在我們有?個圓盤和?個柱子,每個圓盤大小都不一樣,
大的圓盤不能放在小的圓盤上面,?個柱子從左到右排成一排。每次你可以將乙個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上(如果移動之後是合法的話)。現在告訴你初始時的狀態, 你希望用最少的步數將第?大的盤子移動到第?根柱子上,問最小步數。
輸入格式:
第一行乙個正整數?,代表詢問的組數。
接下來?組資料,每組資料第一行乙個整數?。
接下來一行每行?個正整數,代表每個柱子上圓盤的大小。
輸出格式:
輸出共?行,代表每次的答案。如果方案不存在,輸出「−1」 。
樣例輸入:
4 3
2 1 3
2 7 8
2 10000 1000
3 97 96 95
樣例輸出:
4 0
-1 20
樣例解釋:
無。 資料範圍與規定:
對於70%的資料,n的值都是相等的。
對於100%的資料,1≤n≤6×10^3 ,1≤n≤7。
#include
#include
#include
#include
using
namespace
std;
const
int maxn=8000000;
int t,n,b[10],c[10],top[10],s[maxn],p[maxn],m[10],s[maxn];
queue
q;bool flag[maxn];
struct node
reverse(p+1,p+len+1);
for(int i=len;i>=1;i--)
top[p[i]]=i;
for(int i=1;i<=len;i++)
if(i==top[p[i]])
}if(p[i]!=len&&(top[p[i]+1]>i||!top[p[i]+1]))}}
}void ready()
while(!q.empty())
}int main()
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
b[a[i].id]=i;
for(int i=1;i<=n;i++)
c[b[i]]=i;
int s=0;
for(int i=1;i<=n;i++)
s=s*10+c[i];
if(flag[s]==0) cout
<<-1
cout
0;}
漢諾塔(hanoi)問題公升級版
新規則 限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須經過中間。求當塔有n層的時候,列印最優移動過程和最優移動步數 public class hanoiproblem1 public static inthanoi int num,string left,string...
T2485 漢諾塔公升級版(普及)(遞迴)
漢諾塔公升級了 現在我們有n個圓盤和n個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,n個柱子從左向右排成一排。每次你可以將乙個柱子的最上面的圓盤移動到右邊或者左邊的柱子上 如果移動是合法的話 現在告訴你初始時的狀態,你希望用最少的步數將第i大的盤子移動到第i根柱子上,問最小步數。輸入格...
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 ...