就是對乙個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 我用的是打表的方法,打表很不厚道。思路 首先我們需要確定儲存的資料結構,從網上搜得用二進位制位來存,這確實是個很巧妙的方法,例如,我們將...