Advertisement
Guest User

Untitled

a guest
Feb 6th, 2022
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. int shift[8]={10,17,15,6,10,17,15,6};
  5. int path[16];
  6. long long count;
  7. int best, best_count;
  8. unsigned long long mask[8]={
  9. 0xfcfcfcfcfcfcfc00,
  10. 0xFEFEFEFEFEFE0000,
  11. 0x7F7F7F7F7F7F0000,
  12. 0x3F3F3F3F3F3F3F00,
  13. 0x003F3F3F3F3F3F3F,
  14. 0x00007F7F7F7F7F7F,
  15. 0x0000FEFEFEFEFEFE,
  16. 0x00FCFCFCFCFCFCFC
  17. };
  18. void recur(int depth, unsigned long long board);
  19. void show_path();
  20. int main()
  21. {
  22. unsigned long long board, move;
  23. int i;
  24. board=-1;
  25. board&=~mask[0];
  26. board|=mask[0]>>shift[0];
  27. best=13;
  28. for(i=0;i<8;++i){
  29. if(i==4)++i;
  30. path[1]=i;
  31. move = board & ~mask[i];
  32. if(i<4)move |= (board & mask[i]) >> shift[i];
  33. else move |= (board & mask[i]) << shift[i];
  34. recur(2,move);
  35. if(best_count)break;
  36. }
  37. printf("%lld\t%d\n",count,(int)clock());
  38. printf("%d\t%d\n",best,best_count);
  39. return 0;
  40. }
  41. void recur(int depth, unsigned long long board){
  42. unsigned long long move;
  43. int i,j;
  44. if(depth>=best){
  45. ++count;
  46. return;
  47. }
  48. for(i=0;i<8;++i){
  49. path[depth]=i;
  50. move = board & ~mask[i];
  51. if(i<4)move |= (board & mask[i]) >> shift[i];
  52. else move |= (board & mask[i]) << shift[i];
  53. if(move&(move-1)==0){
  54. ++best_count;
  55. for(j=0;j<best;++j)printf("%d ",path[j]);
  56. printf("%4d\n",best_count);
  57. // uncomment to show all steps
  58. //show_path();
  59. }else recur(depth+1,move);
  60. // uncomment to stop after first solution
  61. //if(best_count)break;
  62. }
  63. }
  64.  
  65. void show_path(){
  66. unsigned long long board, move, x;
  67. int i,j;
  68. board=-1;
  69. for(i=0;i<best;++i){
  70. move = board & ~mask[path[i]];
  71. if(path[i]<4)move |= (board & mask[path[i]]) >> shift[path[i]];
  72. else move |= (board & mask[path[i]]) << shift[path[i]];
  73. board=move;
  74. x=1;
  75. x<<=63;
  76. printf("Step %d:\n",i+1);
  77. for(j=0;x;x>>=1){
  78. if(board&x)printf(" N");
  79. else printf(" .");
  80. if(++j%8==0)printf("\n");
  81. }
  82. printf("\n");
  83. }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement