Description

The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey
around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans?
Problem
Find a path such that the knight visits every square once. The knight can start and end on any square of the board.
Input
Output
If no such path exist, you should output impossible on a single line.
Sample Input
3
1 1
2 3
4 3
Sample Output
Scenario #1:
A1
Scenario #2:
impossible
Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
题目给出格子的长和宽,要求以马的走法能否走完全部格子,还要按字典序( lexicographically)输出!
模拟马的走法(int step[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};)
以下是代码:
[cpp] view plaincopy
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include<string.h>
4. #include<math.h>
5. #define max 27
6. int map[max][max],x[max],y[max];
7. int p,q,t=0,sign;
8. int step[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};//模拟马走的步子
9. void cxbdfs(int a,int b)// 深搜
10. {
11. int x1,y1,i;
12. if(sign)// 标记退出
13. return;
14. t++;
15. x[t]=a;
16. y[t]=b;
17. if(t==p*q) // 当全部走遍,标记
18. {
19. sign=1;
20. return;
21. }
22. map[a][b]=1;
23. for(i=0;i<8;i++)
24. {
25. x1=a+step[i][0];
26. y1=b+step[i][1];
27. if(x1>0 && y1>0 && x1<=q && y1<=p && map[x1][y1]==0)// 符合条件进入搜索
28. {
29. cxbdfs(x1,y1);
30. t--;
31. }
32. }
33. map[a][b]=0;//不符合条件回溯时地图从新标记
34. }
35. int main()
36. {
37. int i,n,j=0;
38. scanf("%d",&n);
39. memset(map,0,sizeof(map));
40. while(n--)
41. {
42. j++;
43. sign=0;
44. scanf("%d%d",&p,&q);
45. cxbdfs(1,1);
46. printf("Scenario #%d:\n",j);
47. if(sign)
48. {
49. for(i=1;i<=p*q;i++)
50. printf("%c%d",x[i]+'A'-1,y[i]);
51. printf("\n");
52. }
53. else
54. printf("impossible\n");
55. printf("%s",n==0?"":"\n");
56. }
57. }