POJ 1753 POJ 2965 解題報告

2021-05-23 23:07:59 字數 1215 閱讀 7142

poj 1753 poj 2965

解題報告

poj 1753

和 poj 2965

是同一型別的題目,但是2965

有乙個比較簡單的方法來解決。

poj 1753

我用的是打表的方法,打表很不厚道。

思路:首先我們需要確定儲存的資料結構,從網上搜得用二進位制位來存,這確實是個很巧妙的方法,例如,我們將問題簡化為乙個2x2

的矩陣,那麼就只需要有4

個二進位制位就可以儲存,假如我們需要儲存:bw

wb 那麼我們可以這樣: 用1

來表示b

,0 來表示w

,則該二進位製碼表示為1001b

,轉換為十進位制為9

,故可以int state = 9

,這樣就乙個int

型別的變數就可以代表整個圖了。

有了這個基礎我們就可以說打表的方法了,首先先了解一下異或,異或用xor

表示,異或的結果是:相同取0

,不同取1

。例:0101b xor 1000b = 1101b

。我們觀察異或的結果:把上邊的圖轉換為二進位製碼的結果是:1001b

,那麼,如果我只想翻轉位置為(1,1

)的棋子,那麼我們可以state = state ^ 0001b

(注: 二進位制儲存為從左到右,即如果是wb

,則二進位制為10

)。接下來我們說打表的方法,我們知道,如果翻轉(1,1)

,那麼(1,2),(2,1)

也就隨之翻轉了,還是用這個2x2

的圖為例說明,如果我們想進行上邊提到的(1,1)

的翻轉,那麼我們可以將state

異或上0111b,

我們將類似0111b

這種數字儲存到乙個陣列中,可以打表了。

網上說這是廣度優先搜尋(bfs

poj 1753 ac

的**:

poj 2965

這個題目有乙個比較簡單的方法,我們可以想象一下,假如只想改變(1, 2)

的開關的狀態,則這個時候需要將第1

行第2列的所有開關都按下,此時,則第一行和第一列除了(1, 2)

外都改變了4

次,相當於沒有改變,而(1, 2)

改變了7

次,相當於改變了1

次,剩下的改變了2

次,相當於沒改變。

於是乎我們想到了乙個方法,首先將所有位置都置為false ,

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...