題意:有個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...