A Knight's Journey解題報告(陳小賓)
Description
BackgroundThe 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
The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .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};)
以下是程式碼:
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. }