POJ 2488 A Knight's Journey 【dfs + 思维】
2018-02-26 23:19
204 查看
传送门
// 题意: 给定一个n*m的棋盘, 问是否有一种方式可以使这匹马走遍这个棋盘的每一个点, 有的话打印出路径, 并且字典序要尽可能的小.
思路: 可能难点的地方就是字典序那, 其实不用管, 因为如果我们从除(1, 1)的点走完全程, 那为啥不从(1, 1)出发这个再是字典序最小的呀, 所以我们直接从(1, 1)开始搜就OK啦, 然后因为字典序的原因8个方向有一定的顺序, 然后只要能搜出答案就一定是ans.
注意就是存路径的方式, 最好不要用记录前驱的方法, 这样比较难处理, 具体请看代码.
AC Code
// 题意: 给定一个n*m的棋盘, 问是否有一种方式可以使这匹马走遍这个棋盘的每一个点, 有的话打印出路径, 并且字典序要尽可能的小.
思路: 可能难点的地方就是字典序那, 其实不用管, 因为如果我们从除(1, 1)的点走完全程, 那为啥不从(1, 1)出发这个再是字典序最小的呀, 所以我们直接从(1, 1)开始搜就OK啦, 然后因为字典序的原因8个方向有一定的顺序, 然后只要能搜出答案就一定是ans.
注意就是存路径的方式, 最好不要用记录前驱的方法, 这样比较难处理, 具体请看代码.
AC Code
const int maxn = 25 + 5; int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2}; int dy[] = {-1, 1, -2, 2, -2, 2, -1, 1}; int n, m; int f[maxn*maxn][2], vis[maxn][maxn]; int flag; void dfs(int x, int y, int deep) { if (!flag) return ; f[deep][0] = x; // 这样就可以把每一步存下来啦~ f[deep][1] = y; if (deep == n*m) { for (int i = 1 ; i <= deep ; i ++) { printf("%c%d", f[i][0]+'A'-1, f[i][1]); } printf("\n\n"); flag = 0; return ; } for (int i = 0 ; i < 8 ; i ++) { int xx = x + dx[i]; int yy = y + dy[i]; if (xx < 1 || xx > n || yy < 1 || yy > m) continue; if (vis[xx][yy]) continue; vis[xx][yy] = 1; dfs(xx, yy, deep+1); vis[xx][yy] = 0; } } void solve() { scanf("%d%d", &m, &n); flag = 1; Fill(vis, 0); vis[1][1] = 1; dfs(1, 1, 1); if (flag) printf("impossible\n\n"); }
相关文章推荐
- POJ-2386 Lake Counting (思维+简单dfs)
- Poj 1856 Sea Battle【Dfs+思维】
- 【POJ】2965 - The Pilots Brothers' refrigerator(dfs & 双端队列 & 思维)
- POJ 1321 棋盘问题 (DFS)
- 【DFS(记忆化)】hdu 1078 FatMouse and Cheese(poj 1088 滑雪)
- 度限制最小生成树 POJ 1639 贪心+DFS+prim
- POJ 2676 Sudoku (数独 DFS)
- poj1011木棒 dfs
- POJ 3321 Apple Tree(DFS+树状数组)
- POJ-1111(DFS)
- POJ 1564 && HDU 1258 Sum It Up(dfs)
- POJ - 2152 Fire 【树形dp + 暴力 + 思维】
- dfs-poj-1321棋盘问题
- Hrbust 2302 Another Tree【思维+Dfs】
- Poj 1321 棋盘问题 (DFS水题)
- poj 棋盘问题(经典DFS)(枚举)
- Poj 2488 A Knight's Journey(Dfs)
- POJ 1014.Dividing(DFS)
- 【POJ - 1852】 Ants 【思维】
- 记忆化搜索 dp(dfs)-帮助Jimmy POJ--1661