https://vjudge.net/problem/UVA-10795
一道很有意思的汉诺塔问题
给出你所有块的初态和末态
输出需要多少步才可以将初态移到末态
我自己拿笔写了写
找到了规律
但是我的算法不够统一
导致自己没能用代码去实现
思想大概和标程的思想是一样的
但是标程的思想更加的统一
将初态和末态统一成了一个一样的问题
两种状态同时向中间的某一种状态靠拢
达到了一种非常美丽统一的算法
很有意思
标程代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(int *P,int i,int final){
if(i==0) return 0;
if(P[i]==final) return f(P,i-1,final);
return f(P,i-1,6-P[i]-final)+(1ll<<(i-1));
}
const int N=70;
int n,start[N],finish[N];
int main(){
int Case=0;
while(cin>>n&&n){
for(int i=1;i<=n;++i)
cin>>start[i];
for(int i=1;i<=n;++i)
cin>>finish[i];
int k=n;
while(k>=1&&start[k]==finish[k]){
--k;
}
ll ans=0;
if(k>=1){
int other=6-start[k]-finish[k];
ans=f(start,k-1,other)+f(finish,k-1,other)+1;
}
cout<<"Case "<<++Case<<": "<<ans<<endl;
}
}