POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)
2017-07-03 22:16
525 查看
#include <stdio.h> #define MAX 27 void dfs(int i, int j); int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2}; int marked[MAX][MAX]; //标记 int pathx[MAX]; int pathy[MAX]; int flag, step; int p,q; int main(void) { int n; int i = 0; int j, k; scanf("%d", &n); while (i++ < n) { scanf("%d%d", &p, &q); for (j = 1; j <= p; j++) { for (k = 1; k <= q; k++) marked[j][k] = 0; } flag = 0; step = 0; dfs(1, 1); //从(A, 1)开始搜索 printf("Scenario #%d:\n", i); if (flag) { for (j = 1; j <= p * q; j++) printf("%c%d", pathy[j] + 'A' - 1, pathx[j]); printf("\n"); } else printf("impossible\n"); printf("\n"); } } void dfs(int i, int j) { int x, y; int k; if (flag == 1) return; marked[i][j] = 1; //标记 step++; pathx[step] = i; pathy[step] = j; if (step == p * q) { flag = 1; return; } //注意:二维数组和棋盘的坐标x, y是反的 for (k = 0; k < 8; k++) { x = i + dx[k]; y = j + dy[k]; if (marked[x][y] != 1 && x <= p && x>= 1 && y <= q && y >= 1) { dfs(x, y); step--; //走错了回退时步数-1 } } marked[i][j] = 0; //撤销标记 }
相关文章推荐
- POJ 2488 回溯
- poj 2488 A Knight's Journey(深度优先搜索)
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- poj 2488 dfs+回溯
- 经典回溯——POJ 2488
- POJ-2488(回溯+剪枝)
- POJ 2488 A Knight's Journey(DFS+回溯)
- poj2488 回溯 注意字典 边缘的处理思想
- POJ训练计划2488_A Knight's Journey(DFS+回溯)
- POJ 2488 A Knight's Journey DFS 深搜回溯
- POJ 2488 A Knight's Journey 递归回溯题解
- POJ 2488 DFS+回溯
- poj 2488 深搜+回溯
- POJ 2488 A Knight's Journey
- POJ 2488 A Knight's Journey【dfs过】
- POJ 2488(dfs+字典序)
- POJ 2488 A Knight's Journey(基础题)
- POJ - 2488 A Knight's Journey
- POJ-2488 A Knight's Journey 解题报告