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: ",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 "); 63 puts(""); 64 } 65 return 0; 66 }