POJ2044 深搜 剪枝(雲彩下雨)

2021-06-29 04:02:59 字數 1834 閱讀 5374

題意:

有乙個城鎮,是4*4的大小的,然後你控制一塊雲彩,2*2的,你每天可以有9種走的方法,上下左右,或者不動,走的時候可以走1或者2步,雲彩所在的地方肯定會下雨,然後給你做多365天的安排,要求某些日子的某些城鎮不能下雨(因為有**節日),還有任何地方都不能有連續超過6天不下雨。

思路:首先9種走法,做多連續六點不下雨,這個可以直接dfs深搜,(bfs不知道行不行,沒試過,主要擔心的是記憶體,反正目測bfs佇列queue占用的記憶體太大),如果不優化的話的話時間複雜度可是9^365根本受不了啊,然後就是考慮優化,也就是mark走過的狀態,關鍵是怎麼標記這個狀態,一開始我是想找16個素數,然後根據每個格仔的步數去計算每個16個步數得到的乙個特別值去hash狀態,可以失敗了,找素數的方法不行,舉個例子 3 * 7 + 7 * 3 = 7 * 3 + 3 * 7,然後就是考慮狀態壓縮,可是按照最笨的放發的話狀態壓縮的9^16中狀態,後來我自己優化了下,還是9^12種狀態,還是不行,後來看了別人的解釋,一開始有疑惑,想了好久才說服自己,說下標程,可以只考慮四個點,假如當前用雲彩的左上角表示雲彩,那麼我們只要考慮的四個點就是 1 1 ,1 3 ,3 1,3 3也就是雲彩在四個角落的時候的座標,判斷下雨天數的時候可以只判斷這四個,還有mark的時候也是mark[t][n][a][b][c][d] t 天數,a雲彩當前位置(只記錄左上角,離散化之後就9個),a b c d分別是當前那4個關鍵位置連續沒下雨的天數,然後就直接dfs就行了,下面解釋下為什麼這樣是對的:

(1)充分性 : 只要這四個點都滿足天數不大於7 那麼全圖肯定都滿足,這個自己看下就知道了,因為把圖分成四塊,這四個關鍵點肯定是每乙個塊中連續不下雨天數最長的。

(2)必要性 : 如果全圖都滿足連續不下雨情況,那麼這四個關鍵點必然滿足,因為要想讓(1 ,1) ,(1 ,4) ,(4 ,1) ,(4 ,4)都滿足,那麼必須走這4個關鍵點,別的點照顧不到這。

(3)還有就是只用這四個點代表唯一性是否正確,這個我猶豫了好久,就是這個地方一開始怎麼也想不明白,現在說下我目前的理解。

假如當前狀態

1111 2222        1111 2222   如果按照上面的那個方法mark必須證明這兩個狀態是一

1111 2222        1111 2222   個狀態,我的理解是四個關鍵位置的連續不下雨天數一定

3333 4444        3332 4443   比自己所在的模組的所有天數都大,無論什麼時候,那麼

3333 4444        3332 4443   也就是說如果以後出現問題肯定是這四個最大的中的某個

出現問題,也就是別的點永遠都只是陪襯,所以 陪襯的點

怎麼樣不會影響總的狀態以及最終的趨勢,所以這種mark                               的方法是正確的,這個是我自己的理解。

#include

#include

int day[367];

bool mark[366][10][8][8][8][8];

int ys[12] = ;

int dir[9][2] = ;

int ok ,t;

bool ok(int t ,int x ,int y ,int a)

void dfs(int t ,int x ,int y ,int a)

}return ;

}int main ()

}memset(mark ,0 ,sizeof(mark));

ok = 0;

int a[5];

a[1] = a[2] = a[3] = a[4] = 0;

dfs(0 ,2 ,2 ,a);

printf("%d\n" ,ok);

}return 0;

}

深搜 剪枝 POJ 1011 Sticks

我表示這也許是我第一次做這種要強剪枝的題目.跪了.先是搜尋狀態搞不清連個dfs都寫不出來.然後是不會剪枝狂tle.還是看了這位大神的部落格.才把幾個剪枝搞清楚.少了乙個都會tle.傷不起.搜尋狀態 應該要三維狀態,狀態 cur idx sum 三維,cur 表示當前長棒,idx表示當前短棒 在構造乙...

POJ 1014 Dividing(深搜 剪枝)

考慮值為6的石頭 將值為6的石頭分為兩部分,一部分均分為兩堆,另一部分用於填補缺口。所謂填缺口就是當其他的石頭分完之後再把這部分石頭分入兩堆 也有可能只放入一堆 現在考慮需要多少6值石頭用於填缺口。假設左邊的總值小於右邊的總值 1.要能均分,剩下的缺口一定是6的倍數 2.在分配其他的石頭時,可以做到...

詳解 poj 1190 深搜 加 剪枝

這道題用到 深搜 但是必須剪枝,否則一定超時 我把注釋都寫在程式上了,大家可以一邊看一邊理解 剪枝地方還是要說明一下 遇到三種情況我們就不必搜下去了,需要剪掉 1 v minv m 1 n 當前的體積,加上該層以上的最小體積都比總體積大,一定不符合條件!2 s mins m 1 ans 當前的表面積...