poj 2965 解題報告

2021-06-13 16:31:03 字數 1211 閱讀 7885

就是對乙個4x4的棋盤進行翻轉,每一次翻轉都將讓同一行和列一起翻轉,直到所有符號都變為『-』時成功。

通過列舉加上深度優先搜尋的方法進行解決,列舉通過行號和列號順序進行,每個位置都有翻轉和不翻轉兩種選擇(通過乙個位置兩次翻轉來回溯)

//poj 2965

//244k 844ms

#include using namespace std;

bool openclose[6][6] = ;

int totaldeep = 0;

bool flag = false;

int theloc[17][2] = ;

//struct turnloc

//;//

//turnloc myturn;

////void pushturn(int row, int col) //本來設計的用於壓入操作步驟的函式

////

//void popturn()

//bool whetheropen()

} return true;

}void turnit(int row, int col)

openclose[row][col] = !openclose[row][col]; //翻轉了兩次,翻一次回來

}void dfs(int row, int col, int nowdeep)

if (nowdeep == totaldeep || row == 5)

//當前位置沒有翻轉過,翻轉他

turnit(row, col);

//pushturn(row, col);

theloc[nowdeep][0] = row;

theloc[nowdeep][1] = col;

if (col < 4)

else

dfs(row+1, 1, nowdeep+1);

turnit(row,col);

//popturn();

//跳過當前位置,直接翻轉下乙個位置

if (col < 4)

else

dfs(row+1, 1, nowdeep);

}int main()

} for (totaldeep= 0; totaldeep<=16; totaldeep++)

{ dfs(1,1,0);

if (flag == true)

{cout<

poj2965解題報告

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

poj 2965 遞迴 列舉

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

POJ 1753 POJ 2965 解題報告

poj 1753 poj 2965 解題報告 poj 1753 和 poj 2965 是同一型別的題目,但是2965 有乙個比較簡單的方法來解決。poj 1753 我用的是打表的方法,打表很不厚道。思路 首先我們需要確定儲存的資料結構,從網上搜得用二進位制位來存,這確實是個很巧妙的方法,例如,我們將...