uvaoj 10795 - A Different Task

題解:
1.漢諾塔問題,試圖將初始情況和終止情況通過一箇中間狀態聯繫在一起
總結:
1.這幾天一直在想uvaoj 10253,感覺有點小坎還沒有想出來,感覺以後應該明確解題思路後再寫題,這樣效率會高一些,嗯,寫的過程中發現有些問題沒有考慮到,暫時沒有想出怎麼做,下面再捋一遍這道題的思路,也許會比較好,因爲對這道題的思路都是片段化 + 試代碼試出來的。
2.以後寫題,不管有多大的把握,或者多着急,都還是先把思路想清楚再寫,這樣可以節約很多的時間
3.(1 << (long long )k)就會溢出
((long long)1 << k)纔可以AC

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
#define MAXN 70
int a[MAXN],b[MAXN];
ll solve(int from,int k,int *p)
{
    while(k >= 0 && from == p[k])k--;
    if(k < 0)return 0;
    return solve(6 - p[k] - from,k - 1,p) + ((ll)1 << k);
}
int main()
{
    int kcas = 1,n;
    while(cin >> n && n)
    {
        for(int i = 0;i < n;i++)cin >> a[i];
        for(int i = 0;i < n;i++)cin >> b[i];
        int k = n - 1;
        while(k >= 0 && a[k] == b[k])k--;
        ll ans = 0;
        if(k >= 0)
        {
            int other = 6 - a[k] - b[k];
            ans = solve(other,k - 1,a) + solve(other,k - 1,b) + 1;
        }
        printf("Case %d: %lld\n",kcas++,ans);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章