POJ 2488 A Knight's Journey

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define CL(x, y) memset(x, y, sizeof(x))
 6 using namespace std;
 7 const int MAX = 28;
 8 int N, a, b, flag;
 9 int chessboard[MAX*MAX], used[MAX][MAX];
10 int Move[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//此处知识改变了一下顺序,无过这样,就无语了,666666
11 void DFS(int x, int y, int z);
12 int main()
13 {
14     cin >> N;
15     for(int i = 1; i <= N; i++)
16     {
17         cin >> a >> b;
18         CL(used, 0);
19         CL(chessboard, 0);
20         flag = 0;
21         printf("Scenario #%d:\n", i);
22         DFS(1, 1, 1);
23         if(!flag)
24             cout << "impossible";
25         if(i!=N)
26             cout << endl << endl;
27     }
28 }
29 void DFS(int x, int y, int z)//z表示所走的步数
30 {
31     int i;
32     if(flag)
33         return;
34     used[x][y] = 1;
35     chessboard[z] = x * 10 + y;//此处用于记录新的坐标数, chessboard[][]的范围一定要注意
36     if(z == a*b)
37     {
38         for(i = 1; i <= z; i++)
39             printf("%c%d",chessboard[i]/10+'A'-1,chessboard[i]%10);
40         flag = 1;
41         return ;
42     }
43     for(i = 0; i < 8; i++)
44     {
45         int xx = x + Move[i][0];
46         int yy = y + Move[i][1];
47         if(xx>=1 && xx<=b && yy>=1 && yy<=a && !used[xx][yy])//此处a,b反过来,b:代表字母,a:代表数字
48         {
49             used[xx][yy] = 1;
50             DFS(xx,yy,z+1);
51             if(flag)
52                 return;
53             used[xx][yy] = 0;
54         }
55     }
56     return ;
57 }
View Code

通过一种方法记录位置,这个 方法是在很高明,(x,y)就是xy

posted @ 2015-03-09 17:18  PastLIFE  阅读(100)  评论(0编辑  收藏  举报