fork(2) download
  1. #include <stdio.h>
  2.  
  3. const char q[] = "iiiii.i..ii...Pii..i...Piiii....";
  4.  
  5. void print_bit(unsigned long c, unsigned long g)
  6. {
  7. int i;
  8.  
  9. for (i = 0; i < 32; ++i)
  10. printf("%c", (c & 1UL << i) ? 'i' : (g & 1UL << i) ? 'P' : '.');
  11. printf("\n");
  12. }
  13.  
  14. unsigned long calc_move_R(unsigned long c, unsigned long g)
  15. {
  16. unsigned long mask = (g >> 1) | 0x80000000UL;
  17. while (mask)
  18. {
  19. mask &= c;
  20. c &= ~mask;
  21. mask >>= 1;
  22. }
  23.  
  24. return c;
  25. }
  26.  
  27. unsigned long calc_move_L(unsigned long c, unsigned long g)
  28. {
  29. unsigned long mask = (g << 1) | 1UL;
  30. while (mask)
  31. {
  32. mask &= c;
  33. c &= ~mask;
  34. mask <<= 1;
  35. }
  36.  
  37. return c;
  38. }
  39.  
  40. void solve(unsigned long c, unsigned long g)
  41. {
  42. unsigned long move_R = calc_move_R(c, g);
  43. unsigned long move_L = calc_move_L(c, g);
  44. if (~move_R & move_L) return;
  45. if (!move_R) return;
  46.  
  47. int idx = __builtin_ctzl(move_R);
  48. unsigned long min = 1UL << idx;
  49.  
  50. unsigned long b = move_R;
  51. do
  52. {
  53. unsigned long moved;
  54. unsigned long move_L;
  55. unsigned long rev;
  56.  
  57. moved = c;
  58. moved &= ~b;
  59. moved |= b << 1;
  60.  
  61. move_L = calc_move_L(moved, g);
  62. rev = moved;
  63. rev &= ~move_L;
  64. rev |= move_L >> 1;
  65.  
  66. if (rev == c) print_bit(moved, g);
  67.  
  68. } while (b = (b - min) & move_R);
  69. }
  70.  
  71. int main(void)
  72. {
  73. unsigned long customer = 0;
  74. unsigned long guard = 0;
  75. int i;
  76.  
  77. for (i = 0; i < 32; ++i)
  78. {
  79. switch (q[i])
  80. {
  81. case 'i':
  82. customer |= 1UL << i;
  83. break;
  84.  
  85. case 'P':
  86. guard |= 1UL << i;
  87. break;
  88.  
  89. case '.':
  90. default:
  91. break;
  92. }
  93. }
  94.  
  95. print_bit(customer, guard);
  96. printf("^\n");
  97. solve(customer, guard);
  98.  
  99. return 0;
  100. }
  101.  
Success #stdin #stdout 0s 2292KB
stdin
Standard input is empty
stdout
iiiii.i..ii...Pii..i...Piiii....
^
.iiiii.i..ii..P.ii..i..P.iiii...
i.iiii.i..ii..P.ii..i..P.iiii...
ii.iii.i..ii..P.ii..i..P.iiii...
iii.ii.i..ii..P.ii..i..P.iiii...
iiii.i.i..ii..P.ii..i..P.iiii...
iiiii..i..ii..P.ii..i..P.iiii...
.iiiii.i..ii..Pi.i..i..P.iiii...
i.iiii.i..ii..Pi.i..i..P.iiii...
ii.iii.i..ii..Pi.i..i..P.iiii...
iii.ii.i..ii..Pi.i..i..P.iiii...
iiii.i.i..ii..Pi.i..i..P.iiii...
iiiii..i..ii..Pi.i..i..P.iiii...
.iiiii.i..ii..Pii...i..P.iiii...
i.iiii.i..ii..Pii...i..P.iiii...
ii.iii.i..ii..Pii...i..P.iiii...
iii.ii.i..ii..Pii...i..P.iiii...
iiii.i.i..ii..Pii...i..P.iiii...
iiiii..i..ii..Pii...i..P.iiii...
.iiiii.i..ii..P.ii..i..Pi.iii...
i.iiii.i..ii..P.ii..i..Pi.iii...
ii.iii.i..ii..P.ii..i..Pi.iii...
iii.ii.i..ii..P.ii..i..Pi.iii...
iiii.i.i..ii..P.ii..i..Pi.iii...
iiiii..i..ii..P.ii..i..Pi.iii...
.iiiii.i..ii..Pi.i..i..Pi.iii...
i.iiii.i..ii..Pi.i..i..Pi.iii...
ii.iii.i..ii..Pi.i..i..Pi.iii...
iii.ii.i..ii..Pi.i..i..Pi.iii...
iiii.i.i..ii..Pi.i..i..Pi.iii...
iiiii..i..ii..Pi.i..i..Pi.iii...
.iiiii.i..ii..Pii...i..Pi.iii...
i.iiii.i..ii..Pii...i..Pi.iii...
ii.iii.i..ii..Pii...i..Pi.iii...
iii.ii.i..ii..Pii...i..Pi.iii...
iiii.i.i..ii..Pii...i..Pi.iii...
iiiii..i..ii..Pii...i..Pi.iii...
.iiiii.i..ii..P.ii..i..Pii.ii...
i.iiii.i..ii..P.ii..i..Pii.ii...
ii.iii.i..ii..P.ii..i..Pii.ii...
iii.ii.i..ii..P.ii..i..Pii.ii...
iiii.i.i..ii..P.ii..i..Pii.ii...
iiiii..i..ii..P.ii..i..Pii.ii...
.iiiii.i..ii..Pi.i..i..Pii.ii...
i.iiii.i..ii..Pi.i..i..Pii.ii...
ii.iii.i..ii..Pi.i..i..Pii.ii...
iii.ii.i..ii..Pi.i..i..Pii.ii...
iiii.i.i..ii..Pi.i..i..Pii.ii...
iiiii..i..ii..Pi.i..i..Pii.ii...
.iiiii.i..ii..Pii...i..Pii.ii...
i.iiii.i..ii..Pii...i..Pii.ii...
ii.iii.i..ii..Pii...i..Pii.ii...
iii.ii.i..ii..Pii...i..Pii.ii...
iiii.i.i..ii..Pii...i..Pii.ii...
iiiii..i..ii..Pii...i..Pii.ii...
.iiiii.i..ii..P.ii..i..Piii.i...
i.iiii.i..ii..P.ii..i..Piii.i...
ii.iii.i..ii..P.ii..i..Piii.i...
iii.ii.i..ii..P.ii..i..Piii.i...
iiii.i.i..ii..P.ii..i..Piii.i...
iiiii..i..ii..P.ii..i..Piii.i...
.iiiii.i..ii..Pi.i..i..Piii.i...
i.iiii.i..ii..Pi.i..i..Piii.i...
ii.iii.i..ii..Pi.i..i..Piii.i...
iii.ii.i..ii..Pi.i..i..Piii.i...
iiii.i.i..ii..Pi.i..i..Piii.i...
iiiii..i..ii..Pi.i..i..Piii.i...
.iiiii.i..ii..Pii...i..Piii.i...
i.iiii.i..ii..Pii...i..Piii.i...
ii.iii.i..ii..Pii...i..Piii.i...
iii.ii.i..ii..Pii...i..Piii.i...
iiii.i.i..ii..Pii...i..Piii.i...
iiiii..i..ii..Pii...i..Piii.i...
.iiiii.i..ii..P.ii..i..Piiii....
i.iiii.i..ii..P.ii..i..Piiii....
ii.iii.i..ii..P.ii..i..Piiii....
iii.ii.i..ii..P.ii..i..Piiii....
iiii.i.i..ii..P.ii..i..Piiii....
iiiii..i..ii..P.ii..i..Piiii....
.iiiii.i..ii..Pi.i..i..Piiii....
i.iiii.i..ii..Pi.i..i..Piiii....
ii.iii.i..ii..Pi.i..i..Piiii....
iii.ii.i..ii..Pi.i..i..Piiii....
iiii.i.i..ii..Pi.i..i..Piiii....
iiiii..i..ii..Pi.i..i..Piiii....
.iiiii.i..ii..Pii...i..Piiii....
i.iiii.i..ii..Pii...i..Piiii....
ii.iii.i..ii..Pii...i..Piiii....
iii.ii.i..ii..Pii...i..Piiii....
iiii.i.i..ii..Pii...i..Piiii....
iiiii..i..ii..Pii...i..Piiii....