POJ2488 騎士遊歷 DFS

2021-06-19 10:30:49 字數 1692 閱讀 8415

題目意思是在乙個國際棋盤裡,判斷馬能否不重複的走過所有格,並記錄下其中按字典序排列的第一種路徑。

dfs方法解決,由於是字典順序,所以搜尋方向要嚴格規定

本題錯了幾次,原因是memset沒有使用正確,此函式的第三個引數是按位元組的單位,所以陣列長度還要乘以sizeof(type)

160k 63ms c++ 3332b 2013-11-28 10:29:22

下圖是搜尋的順序:

以下是**:

#include#include#include#include #include #include #include using namespace std;

#include #include #define n_p 27

#define n_q 27

int g_chessboard[n_p][n_q] = {};

char g_char[27] = {};

int g_printrule[100][2] = {};

int g_varp = 0;

int g_varq = 0;

int g_movenum = 0;

#define rangep(m) (m >= 1 && m <= g_varp)

#define rangeq(m) (m >= 1 && m <= g_varq)

void getpos(int idir, int iinp, int iinq, int& ioutp, int& ioutq)

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8: }}

bool dfs(int ip, int iq)

int itp = 0;

int itq = 0;

for(int i = 1; i <= 8; i++)

if(0 == g_chessboard[itp][itq])

if(dfs(itp, itq))

} }

if(g_movenum == g_varp * g_varq) // 全部走完

g_chessboard[ip][iq] = 0;

g_movenum--;

return false;

}bool visits(int& ioutp, int& ioutq)

} }return false;

}void printrule()

} for(int k = 1; k <= g_movenum; k++)

printf("\n");

}int main()

int inumtest = 0;

int p = 0;

int q = 0;

scanf("%d",&inumtest);

for(int i = 0; i < inumtest; i++)

else

if(i != inumtest-1)

printf("\n");

} //cout<<::gettickcount take>

POJ 2488 爵士問題 DFS遍歷

路線可能有多條,線路要求輸出的是按字典序搜尋出現的第乙個路線 也就是要從 1,1 開始 思路 從 1,1 點開始,直接深搜八個方向,注意方向的優先順序 直接搜尋就可以 程式設計要細心,如將 寫成 導致除錯乙個多小時,此類錯誤以後務必杜絕!include include include using n...

(水)POJ 2488字典序dfs

題目大意 給乙個p,q分別代表圖的行與列數 列在輸出時用a,b.表示 規定乙個走的規則,求出走遍所有格仔且不重複的方法,若有多種答案則輸出字典序最小的,無輸出impossible。這裡的字典序以列優先,即a2 分析 想要走遍全圖很簡單,這裡棘手的便是要輸出字典序最小的乙個,由於dfs的特性,我們可以...

poj 2488 深度優先遍歷

題目大意 按照西洋棋騎士的走法,要你讓騎士能夠遍歷每個棋盤的格仔,按照字典序輸出走法,沒有則輸出impossible 解題思路 深度優先遍歷,因為要按字典序輸出,所以,深度遍歷時要按照一定的方向進行遍歷 include include include using namespace std cons...