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