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