VJ水題堆:hdu 2045 不容易系列之(3)―― LELE的RPG難題

好吧,這又是VJ水題堆裏的一道題。
糾結了好長時間,終於把這道題磕過了,用到了很簡單的深搜和記憶化搜索。不過上網搜代碼的時候發現只是一道簡單的數學題
/想哭.jpg
先掏出小本本記錄下把這道題作爲數學題的解題方法

首先 f(1)=3;f(2)=6;f(3)=6 現在考慮n>3的情況,若第n-1個格子和第一個格子不同,則爲f(n-1);
若第n-1個格子和第1個格子相同,則第n-2個格子和第一個格子必然不同,此時爲f(n-2)再乘第n個格子的顏色數,很顯然第n個格子可以是第一個格子(也是第n-1個格子)的顏色外的另外兩種,這樣爲2*f(n-2);

因此總的情況爲f(n)=f(n-1)+2*f(n-2);

哎呀這解題方式真是妙啊,一下就否定了我一下午的辛勤勞作,還挺讓我不甘心的。不過我自己是用深搜做的,這是我的博客,所以一定要炫耀一下我第一次獨立寫的深度搜索。

#include<stdio.h>
#include<string.h>
int color[100],Ncolor;
int num;
int ways;
//紅色爲1,綠色爲2,藍色爲3
#define Q(x){\
    num=x;ways=0;\
    memset(color,0,sizeof(color));Ncolor=0;\
    dfs(0);printf("%d\n",ways);}
/*
RPG思路:
當前的顏色塊不能與上一塊相同。最後一塊顏色塊(n>=2)不能與第一塊相同
可以設上一塊顏色爲Ncolor,作爲全局變量儲存
當輸入數據爲n時:
Q(n)代表總共有n塊需要塗色,0種方法,將色塊清空。此時對於第一塊來說不能塗的顏色是0
從0開始進行塗色試探

試探過程:
先塗color[0]塊,給它塗1,2,3三種顏色;
如果當前色塊是可以塗色的(color[cur]!=Ncolor),就將不能塗的顏色改爲當前顏色,並進行下一塊顏色的試探;
如果該塗第i塊時,發現i==n,說明已經完全塗完了一次。這個時候需要檢驗剛剛塗的那一塊(也就是最後一塊)的顏色是否跟第一次一樣。
如果n==1,方法數++;
如果n>1且color[0]!=color[n-1],方法數++;
如果n>1且相等,直接return;
*/
void dfs(int cur)
{
    if(cur==num)
    {
        if(num==1){ways++;return;}
        if(color[cur-1]!=color[0])
            ways++;
        return;
    }
    for(int i=1;i<=3;i++)
    {

            color[cur]=i;
            if(color[cur]!=Ncolor)
        {
            int t=Ncolor;
            Ncolor=i;dfs(cur+1);
            Ncolor=t;
        }
    }

}
int main()
{

    int x;
    while(scanf("%d",&x)!=EOF)
    {
        Q(x);
    }
    return 0;
}

好,這就是深度搜索TLE的失敗案例。因爲徹底沒有找到一個遞推關係式,所以也沒有成功做到記憶化搜索。也就是說,下午的時間我只是自己熟悉了一下深搜。
開心!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章