fork download
  1. #include <stdio.h>
  2.  
  3. #define BIT_IDX(X, Y) (X + (Y << 3))
  4. #define XYBIT(X, Y) (1ULL << BIT_IDX(X, Y))
  5. #define IF_CAN_JUMP(X, Y) xx = x + X; yy = y + Y; if (0 <= xx && xx <= 7 && 0 <= yy && yy <= 7)
  6.  
  7. int main(void) {
  8. unsigned long long now;
  9. unsigned long long old;
  10. int step;
  11. int score[64];
  12. unsigned long long bit[64];
  13. int i;
  14. int x;
  15. int y;
  16.  
  17. for(i = 0; i < 64; ++i)
  18. {
  19. unsigned long long bitmap = 0;
  20. int x = i % 8; int xx;
  21. int y = i / 8; int yy;
  22.  
  23. IF_CAN_JUMP(-1, -2) bitmap |= XYBIT(xx, yy);
  24. IF_CAN_JUMP(-1, +2) bitmap |= XYBIT(xx, yy);
  25. IF_CAN_JUMP(+1, -2) bitmap |= XYBIT(xx, yy);
  26. IF_CAN_JUMP(+1, +2) bitmap |= XYBIT(xx, yy);
  27. IF_CAN_JUMP(-2, -1) bitmap |= XYBIT(xx, yy);
  28. IF_CAN_JUMP(-2, +1) bitmap |= XYBIT(xx, yy);
  29. IF_CAN_JUMP(+2, -1) bitmap |= XYBIT(xx, yy);
  30. IF_CAN_JUMP(+2, +1) bitmap |= XYBIT(xx, yy);
  31.  
  32. bit[i] = bitmap;
  33. score[i] = 0;
  34. }
  35.  
  36. now = XYBIT(0, 0);
  37. old = now;
  38. step = 1;
  39.  
  40. while (old != 0xffffffffffffffffULL)
  41. {
  42. unsigned long long to = 0;
  43.  
  44. while (now)
  45. {
  46. int idx = __builtin_ctzll(now);
  47. now &= now - 1;
  48. to |= bit[idx];
  49. }
  50.  
  51. now = (to & ~old);
  52. old |= now;
  53. to = now;
  54.  
  55. while (to)
  56. {
  57. int idx = __builtin_ctzll(to);
  58. to &= to - 1;
  59. score[idx] = step;
  60. }
  61. ++step;
  62. }
  63.  
  64. printf(" 1 2 3 4 5 6 7 8\n");
  65. printf(" ---------------\n");
  66. for(y = 0; y < 8; ++y)
  67. {
  68. printf("%d |", y + 1);
  69. for( x = 0; x < 8; ++x)
  70. printf(" %d", score[BIT_IDX(x, y)]);
  71. printf("\n");
  72. }
  73.  
  74. return 0;
  75. }
  76.  
Success #stdin #stdout 0s 2248KB
stdin
Standard input is empty
stdout
    1 2 3 4 5 6 7 8
    ---------------
1 | 0 3 2 3 2 3 4 5
2 | 3 4 1 2 3 4 3 4
3 | 2 1 4 3 2 3 4 5
4 | 3 2 3 2 3 4 3 4
5 | 2 3 2 3 4 3 4 5
6 | 3 4 3 4 3 4 5 4
7 | 4 3 4 3 4 5 4 5
8 | 5 4 5 4 5 4 5 6