跳马问题
在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘。
输出前5个方案及总方案数。
输出格式示例:
1 16 21 10 25
20 11 24 15 22
17 2 19 6 9
12 7 4 23 14
3 18 13 8 5
1. #include<iostream> 2. #include<cstdio> 3. #include<iomanip> 4. using namespace std; 5. int X[8]={1,2,2,1,-1,-2,-2,-1}; 6. int Y[8]={-2,-1,1,2,2,1,-1,-2}; 7. int a[100][100]={0},num=0; 8. bool b[100][100]={0}; 9. void print() 10. { 11. num++; 12. if(num<=5){ 13. for(int k=1;k<=5;k++){ 14. for(int kk=1;kk<=5;kk++) 15. cout<<setw(5)<<a[k][kk]; 16. cout<<endl; 17. } 18. cout<<endl; 19. } 20. } 21. int search(int i,int j,int n) 22. { 23. int k,x,y; 24. if(n>25){ 25. print(); 26. return 0; 27. } 28. for(k=0;k<=7;k++){ 29. x=i+X[k]; 30. y=j+Y[k]; 31. if(x<=5&&x>=1&&y<=5&&y>=1&&(!b[x][y])) { 32. b[x][y]=1; 33. a[x][y]=n; 34. search(x,y,n+1); 35. b[x][y]=0; 36. a[x][y]=0; 37. } 38. } 39. } 40. int main() 41. { 42. a[1][1]=1; 43. b[1][1]=1; 44. search(1,1,2); 45. cout<<num<<endl; 46. return 0; 47. }