poj2965 位運算壓縮 bfs 記憶路徑

2021-09-06 13:00:59 字數 1023 閱讀 2052

題意:有個4*4的開關,裡面有著16個小開關

-+--

----

---- '+'表示開關是關著的,'-'表示開關是開著的,只有所有的開關全被開啟,總開關才會被開啟。現在有一種操作,只要改變某個開關,那麼這個開關的行列所在開關都會被改變

-+-- 問,要開啟總開關至少要改變多少次開關?並輸出改變開關的位置。

思路: 由於每個開關只有兩種狀態,那麼對於這16個小開關,我們可以用2進製來壓縮下,如果開關是開啟的那麼為'0',如果是關著的,那麼為'1',如此,我們就可以從下到上,從右到左給這16個開關

標記狀態,如果以某個點為中心,那麼這個點的行列狀態都壓縮進去,遇到這個點,取反與不取反,然後一次廣搜過去,再記憶下路徑,結果就出來了......

#include

#include

#include

#include

using

namespace std;

#define m 1

<<

16int t[

20]=

;struct

node

;struct

node1

s[(1

<<

17)];

//bool vist[(1<<17)];

int sum;

void

print

(int ans)

void

bfs(

int ans)

for(

int i=

0;i<

16;i++)}}

}int

main

() cnt--;}}

//printf("%d\n",ans);

sum=ans;

for(

int i=

0;i<(m);i++)

bfs(ans);

return0;

}

poj 2965 解題報告

就是對乙個4x4的棋盤進行翻轉,每一次翻轉都將讓同一行和列一起翻轉,直到所有符號都變為 時成功。通過列舉加上深度優先搜尋的方法進行解決,列舉通過行號和列號順序進行,每個位置都有翻轉和不翻轉兩種選擇 通過乙個位置兩次翻轉來回溯 poj 2965 244k 844ms include using nam...

poj 2965 遞迴 列舉

本題與1753思路一樣,區別就在於要記錄位置。deep是當前進行到了哪一步,step是判斷用step步是否可以完成,因此記錄位置只需在change 後做,回溯的時候雖然會說明上一步無效,但不用修改記錄,因為下一次記錄會覆蓋它。include using namespace std bool map ...

poj2965解題報告

這道題目的思路和 url 的思路一樣。有所不同的是這道題目中還需要輸出搜尋的路徑,於是在unit中加了乙個pre變數以記錄搜尋的路徑,最後通過遞迴呼叫print detail從前往後輸出寬搜的結果。problem 2965 user godfrey90 memory 1992k time 1000m...