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