HDU3220逆向思維的BFS

2021-09-30 04:15:45 字數 557 閱讀 6416

這道題有兩個重要的地方,乙個是對題目的理解,合法的操作只有一種,那就是對相鄰的兩個狀態不同的燈泡進行交換狀態的操作,也就是說,相鄰的燈泡如果都是亮著的或者暗著的,那麼不能對這條邊進行操作。

第二點,那就是由於所有的狀態的目標狀態都是一樣的,那麼我們就可以從目標狀態進行bfs,計算出其他狀態到目標狀態要多少步,注意當bfs的步數大於3的時候,就不要將其子狀態放入佇列中,為了方便,之前將全部的狀態的需要步數設定為5,這樣即使沒有訪問的狀態,步數也是大於3的,這個演算法的時間複雜度是o(32^3),完全可以接受,之後就是o(1)的查詢。

為了方便bfs,優化空間,運用位壓縮,將16個燈泡的狀態用乙個int來存放,高位存放低編號的燈泡,裝換的時候就用異或運算即可。

陣列x和y用來對應32對相鄰的燈泡

我的**:

總結:在搜尋的時候,我們經常要想到是否有可以優化的方法,位壓縮是乙個很好的節約空間的方式,另外,這題不可能對每個狀態正向bfs,那樣在多case的情況下肯定是tle的,另外就是要仔細看題,理解題目的意思,對題目的理解如果錯誤,將會導致思路的定式,覺得自己肯定是對的,這樣,在比賽的時候就會心慌,嚴重影響比賽的狀態。

HDU 4496 並查集 逆向思維

給你n個點m條邊,保證已經是個連通圖,問每次按順序去掉給定的一條邊,當前的連通塊數量。與其正過來思考當前這邊會不會是橋,不如倒過來在n個點即n個連通塊下建圖,檢查其連通性,就能知道個數了 date 2017 09 21 23 26 20 filename hdu 4496 並查集 逆向思維.cpp ...

完全揹包中的逆向思維

我們知道,在01揹包和完全揹包的實現中,都是針對每種物品進行討論,即外迴圈都是for i 0 n,然後每種物品對於容量v的變化而求得最大價值 在完全揹包中,由於物品的件數無限,所以我們可以倒過來想,我們針對每個容量討論,外迴圈為容量,對於每個容量j,我們求j對於所有物品能裝載的最大價值,這樣一來我們...

強盜分贓 充滿 逆向思維「的故事

從前有五個強盜搶得了100枚金幣,但在分贓這100枚金幣上的問題爭吵不休,最後他們決定進行民主分配 首先由5個人進行抽籤選舉,抽籤獲得每個人的號碼,然後由抽到1號的人提出分配方案,然後進行大眾投票,如果超過半數人投反對票,則把1號丟進大海喂鯊魚,然後由2號提供分配方案,當2號的分配方案也達成超過半數...