标签:
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 }
通过一种方法记录位置,这个 方法是在很高明,(x,y)就是xy
POJ 2488 A Knight's Journey _BFS
标签:
原文地址:http://www.cnblogs.com/tyx0604/p/4324040.html