A Knight's Journey(dfs)

http://poj.org/problem?id=2488

题意:给定一个row*col 的棋盘,列上用字母A,B,C······ 表示,行上用数字1,2,3······表示,问马是否能走遍整个棋盘,并将走的路径按字典序顺序输出。

思路:只要按照dir[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};这个方向搜索,得出的路径即按字典序输出的。

 1 #include <stdio.h>
 2 #include <string.h>
 3 char s[520];
 4 int row,col,flag;
 5 int vis[120][120];
 6 int dir[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
 7                  //必须按这个方向搜索
 8 struct node
 9 {
10     char  x;
11     char   y;
12 } g[520];//储存路径
13 void dfs(int x,int y,int step)
14 {
15     if (step==row*col)
16     {
17         flag = 1;
18         return ;
19     }
20     for (int i = 0; i < 8; i ++)
21     {
22         int dx = x+dir[i][0];
23         int dy = y+dir[i][1];
24         if (dx >= 1 && dx <= col && dy >= 1 && dy <= row && !vis[dx][dy])
25         {
26 
27             g[step].x = dx +'A'-1;
28             g[step].y = dy + '0';
29             vis[dx][dy] = 1;
30             dfs(dx,dy,step+1);
31             if (flag)
32                 return ;
33             vis[dx][dy]  = 0;
34         }
35     }
36 }
37 void init()
38 {
39     memset(vis,0,sizeof(vis));
40     g[0].x = 'A';
41     g[0].y = '1';
42     vis[1][1] = 1;
43     flag = 0;
44 }
45 int main()
46 {
47     int t;
48     scanf("%d",&t);
49     for (int i = 1; i <= t; i ++)
50     {
51         init();
52         scanf("%d%d",&row,&col);
53         dfs(1,1,1);
54         printf("Scenario #%d:\n",i);
55         if (flag)
56         {
57             for (int j = 0; j < row*col; j ++)
58                 printf("%c%c",g[j].x,g[j].y);
59             puts("");
60         }
61         else
62             printf("impossible\n");
63         puts("");
64     }
65     return 0;
66 }
View Code

 

posted @ 2013-08-30 00:10  N_ll  阅读(149)  评论(0编辑  收藏  举报