Description
Background
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. }

本文探讨了骑士周游问题,即在一个缩小版的国际象棋棋盘上找到一条路径,使得骑士能恰好访问每个方格一次。文章提供了一种通过深度优先搜索实现的解决方案,并附带了完整的C++代码实现。
1747

被折叠的 条评论
为什么被折叠?



