A Za, A Za, Fighting...

坚信:勤能补拙

PKU 2488 A Knight's Journey

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2488

思路:
十分熟悉的DFS
需要注意的一点是: 字典序,所以八个方向的搜索次序不是任意的,从左向右,从上到下,这里定义:
1 const int dx[] = {-11-22-22-11};
2 const int dy[] = {-2-2-1-11122};

另外,我觉得只有从任何一个点出发都没法遍历,才应该输出impossible
不过,看了网上的代码,都只需要从左上角出发即可得出结论

代码:
 1 #define is_valid(x, y) (x>=0 && x<row && y>=0 && y<col)
 2 struct Item {
 3     int x, y;
 4 } path[MAX_LEN];
 5 int visited[MAX_LEN][MAX_LEN];
 6 int row, col, flag;
 7 const int dx[] = {-11-22-22-11};
 8 const int dy[] = {-2-2-1-11122};
 9 
10 void
11 dfs(int depth, int x, int y)
12 {
13     int i, tx, ty;
14     visited[x][y] = 1;
15     path[depth].x = x;
16     path[depth].y = y;
17     if(depth+1 == row*col) {
18         if(!flag) {
19             flag = 1;
20             for(i=0; i<row*col; i++)
21                 printf("%c%d"'A'+path[i].y, path[i].x+1);
22             printf("\n");
23         }
24     }
25     if(!flag) {
26         for(i=0; i<8; i++) {
27             tx = x + dx[i];
28             ty = y + dy[i];
29             if(is_valid(tx, ty) && !visited[tx][ty])
30                 dfs(depth+1, tx, ty);
31         }
32     }
33     visited[x][y] = 0;
34 }
35 
36 void
37 solve()
38 {
39     int i, j;
40     memset(visited, 0sizeof(visited));
41     flag = 0;
42     for(i=0; i<row; i++)
43         for(j=0; j<col; j++)
44             if(!flag)
45                 dfs(0, i, j);
46     if(!flag)
47         printf("impossible\n");
48 }

posted on 2010-07-29 12:34 simplyzhao 阅读(187) 评论(0)  编辑 收藏 引用 所属分类: B_搜索


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜