POJ 2488 A Knight's Journey DFS
来源:互联网 发布:数据库设计步骤 编辑:程序博客网 时间:2024/05/16 17:59
看到此题就要想到用DFS,但是题目还有一个弯子要注意:
(Find a path such that the knight visits every square once. The knight can start and end on any square of the board..)骑士可以从任意地方开始,可以在任意地方结束,但必须遍历所有方块。一开始我就是想是不是棋盘每个位置都要DFS,其实没有那个必要,因为我们走的“日”字步完全是一个可逆的过程,如果起点是(a,b),那么从这点能找到一条到(0,0)的路径,这就说明从(0,0)也可以能到(a,b),如果我们不能从(0,0)点遍历棋盘每个点一次,那么肯定存在一点也不能遍历到(0,0)点,所以我们只需要从(0,0)位置DFS一下就可以了.....
但是此题一定要注意一下三点:
(1)注意每个case后面有一行空行
(2)就是以字典序遍历.....这个可是害苦我了.....调试了几个小时啊
下面是字典序编号
(3)国际象棋的棋盘,横的是字母,竖的才是数字
下面是AC代码:
#include<cstdio>#include<cstring>#define MAXN 9int vis[MAXN][MAXN];int n,succes=0;int p,q;int dy[8]={-2,-2,-1,-1,1, 1, 2,2};int dx[8]={-1,1, -2,2,-2,2, -1,1};int px[MAXN*MAXN];int py[MAXN*MAXN];void dfs(int depth, int x, int y){px[depth]=x;py[depth]=y;if(depth == n){for(int i=1; i<=n; i++){printf("%c%d",'A'+py[i], px[i]+1);}printf("\n");succes=1;return;}for(int i=0; i<8; i++){int tx =x+dx[i];int ty =y+dy[i];if(tx >=0 && tx <p && ty >=0 && ty <q && !vis[tx][ty] && !succes){vis[tx][ty]=1;dfs(depth+1, tx, ty);vis[tx][ty]=0;}}}int main(){int tmp=1;int c;scanf("%d", &c);while(c--){succes=0;memset(vis, 0, sizeof(vis));scanf("%d%d", &p, &q);n=p*q;printf("Scenario #%d:\n", tmp);vis[0][0]=1;dfs(1,0,0);if(!succes)printf("impossible\n");printf("\n");tmp++;}return 0;}
如果我们考虑从任意位置开始
下面是AC代码:
#include<cstdio>#include<cstring>#define MAXN 26int vis[MAXN][MAXN];int n,succes=0;int p,q;int dy[8]={-2,-2,-1,-1,1, 1, 2,2};int dx[8]={-1,1, -2,2,-2,2, -1,1};int px[MAXN*MAXN];int py[MAXN*MAXN];void dfs(int depth, int x, int y){px[depth]=x;py[depth]=y;if(depth == n){for(int i=1; i<=n; i++){printf("%c%d",'A'+py[i], px[i]+1);}printf("\n");succes=1;return;}for(int i=0; i<8; i++){int tx =x+dx[i];int ty =y+dy[i];if(!succes && tx >=0 && tx <p && ty >=0 && ty <q && !vis[tx][ty]){vis[tx][ty]=1;dfs(depth+1, tx, ty);vis[tx][ty]=0;}}}int main(){int tmp=1;int c;scanf("%d", &c);while(c--){succes=0;scanf("%d%d", &p, &q);n=p*q;printf("Scenario #%d:\n", tmp);for(int i=0;i<p;i++){for(int j=0;j<q;j++){if(!succes){memset(vis, 0, sizeof(vis));succes =0;vis[i][j]=1;dfs(1,i,j);}}}if(!succes)printf("impossible\n");printf("\n");tmp++;}return 0;}
0 0
- 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 - A Knight's Journey (DFS)
- POJ 2488 A Knight's Journey【DFS】
- poj 2488 A Knight's Journey (Dfs)
- A Knight's Journey (poj 2488 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-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 A Knight's Journey【dfs】
- iOS程序员必须知道的Android要点
- Maven学习笔记
- [leetcode]Spiral Matrix&&Spiral Matrix II
- 开闭原则
- 杭电1166 敌兵布阵 线段树and树状数组
- POJ 2488 A Knight's Journey DFS
- 图论(一)最小生成树
- leetcode:Binary Tree Inorder Traversal
- XML 简介
- 选择排序法
- GCD小结
- Android 101 for iOS Developers
- 向量的数量函数的导数
- js冒泡、捕获事件及阻止冒泡方法