poj 2488 DFS水过
2013-02-28 20:39
267 查看
题目给出 n行m列的棋盘,问马可以全部的棋盘格都走过一遍吗,马以 L 型走
很土的办法,枚举起点,然后进行dfs并记录路径,注意要输出 字典序最小的一条路径,所以按照 程序中的 dx,dy方向数组就可以搞定了。。
很土的办法,枚举起点,然后进行dfs并记录路径,注意要输出 字典序最小的一条路径,所以按照 程序中的 dx,dy方向数组就可以搞定了。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 30; bool vis[maxn][maxn], flag; int dx[] = { -1, 1, -2, 2, -2, 2, -1, 1 }, dy[] = { -2, -2, -1, -1, 1, 1, 2, 2 };//注意顺序 int n, m, end; char s[60]; bool ok(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; } void dfs(int x, int y, int cnt, char *s) { if (flag) return; if (cnt == end) { puts(s); flag = true; return; } for (int i = 0; i < 8; i++) { int xx = x + dx[i], yy = y + dy[i]; if (ok(xx, yy) && !vis[xx][yy]) { vis[xx][yy] = true; s[cnt] = yy + 'A'; s[cnt+1] = xx + '1'; dfs(xx, yy, cnt+2, s); vis[xx][yy] = false; } } } int main() { int t; int cas=0; scanf("%d", &t); while (t--) { printf("Scenario #%d:\n",++cas); scanf("%d%d", &n, &m); end = n * m * 2; flag = false; for (int j = 0; j < m; j++) {//先枚举列,以得到最小字典序 for (int i = 0; i < n; i++) { memset(vis, 0, sizeof(vis)); memset(s, 0, sizeof(s)); s[0] = j + 'A'; s[1] = i + '1'; vis[i][j]=true;//记得标记。。 dfs(i, j, 2, s); if (flag) goto endloop; } } endloop: if (!flag) puts("impossible"); puts(""); } }
相关文章推荐
- POJ2488 A Knight's Journey(DFS)
- poj 2488 A Knight's Journey DFS
- POJ 题目 2488 A Knight's Journey(dfs)
- poj 2488 A Knight's Journey( dfs )
- POJ 2488 A Knight's Journey (DFS)
- (水)POJ-2488字典序dfs
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- poj 2488 A Knight's Journey(简单dfs)
- POJ 2488 搜索题DFS
- 【dfs】POJ-2488-A Knight's Journey
- POJ 2488 DFS
- poj 2488 dfs
- poj 2488 DFS
- POJ 2488-A Knight's Journey(DFS-象棋中的马)
- DFS--poj 2488
- POJ 2488 A Knight's Journey (dfs)
- POJ 2488 A Knight's Journey(DFS)
- POJ 2488 A Knight&#39;s Journey (棋盘DFS)
- POJ 2488 DFS水题
- POJ 2488 _ DFS