POJ-2488(回溯+剪枝)
2014-06-16 15:15
260 查看
与经典的骑士问题不同之处在于:因为要求字典序最小,所以搜索时我们要保证下一个可以遍历到的点是字典序最小的即可
#include <cstdio> #include <cstring> int M, N; //M is row(1,2,...), N is col(A,B,...) bool canBeStart[26][26];//record whether [i][j] can be start int total, vis[26][26];//total = M * N, record [i][j]'s visit time(0 ~ total-1) char path[26 * 2 + 1]; //total path const int MOVE[8][2] = { {-1, -2}, {1, -2}, {-2, -1}, {2, -1}, {-2, 1}, {2, 1}, {-1, 2}, {1, 2}, }; bool isOutOfBounds(int r, int c) { return r < 0 || r >= M || c < 0 || c >= N; } bool dfs(int row, int col, int time) { vis[row][col] = time++; if(time == total) return true; for(int i = 0; i < 8; ++i){ int r = row + MOVE[i][0], c = col + MOVE[i][1]; if(isOutOfBounds(r, c) || vis[r][c] >= 0) continue; if(dfs(r, c, time)) return true; } vis[row][col] = -1; return false; } bool findPath() { //step 1: initialize total = M * N; for(int i = 0; i < M; ++i) memset(canBeStart, true, N); //step 2: dfs at each start point for(int i = 0; i < M; ++i){ for(int j = 0; j < N; ++j){ if(!canBeStart[i][j]) continue; for(int k = 0; k < M; ++k) memset(vis[k], 0xFF, N * sizeof(int)); if(dfs(i, j, 0)) return true; else{//mark centrosymmetric point can not be start canBeStart[i][j] = false; canBeStart[M-1-i][j] = false; canBeStart[i][N-1-j] = false; canBeStart[M-1-i][N-1-j] = false; } } } return false; } void outputPath() { for(int i = 0; i < M; ++i){//row for(int j = 0; j < N; ++j){//col int pos = vis[i][j] << 1; path[pos] = j + 'A'; path[pos+1] = i + '1'; } } path[M * N * 2] = '\0'; puts(path); } int main() { int t, T; scanf("%d", &T); for(t = 1; t <= T; ++t){ scanf("%d%d", &M, &N); printf("Scenario #%d:\n", t); if(findPath()) outputPath(); else puts("impossible"); puts(""); } return 0; }
相关文章推荐
- POJ 2488 回溯
- POJ 2531 dfs回溯(小剪枝)
- POJ 2488 A Knight's Journey DFS 深搜回溯
- POJ 2488 A Knight's Journey(DFS+回溯)
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- POJ 1011 Sticks(DFS回溯剪枝)
- 经典回溯——POJ 2488
- poj 2488 深搜+回溯
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- poj2488 回溯 注意字典 边缘的处理思想
- POJ 2676 Sudoku (DFS回溯剪枝)
- poj 2488 dfs+回溯
- POJ 2488 DFS+回溯
- POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)
- POJ1190 生日蛋糕 ACM解题报告(DFS回溯+剪枝)
- poj 1011 回溯+剪枝 木棒问题
- POJ_1321——棋盘问题,回溯+剪枝
- POJ训练计划2488_A Knight's Journey(DFS+回溯)
- POJ 2488 A Knight's Journey 递归回溯题解
- POJ-1465-bfs,同余剪枝