fork download
  1. #include<stdio.h>
  2.  
  3. #define TOP_WIDTH (5) // ← 最上行の数字個数
  4.  
  5. #define ALL_N (TOP_WIDTH * (TOP_WIDTH + 1) / 2)
  6.  
  7. // 並べ替え結果処理
  8. void kekka_shori(int *d, int len)
  9. {
  10. int i, j, tmp[2][TOP_WIDTH], *p[2], *swap, ans[ALL_N], *pa = &ans[0];
  11. unsigned long b = 0x0;
  12.  
  13. for (i = 0; i < TOP_WIDTH; i++) {
  14. *pa++ = tmp[0][i] = d[i];
  15. }
  16. p[0] = &tmp[0][0];
  17. p[1] = &tmp[1][0];
  18. for (j = TOP_WIDTH; j >= 2; j--) {
  19. for (i = 0; i < j; i++) {
  20. b |= 1 << (p[0][i] - 1);
  21. }
  22. for (i = 0; i < j - 1; i++) {
  23. p[1][i] = p[0][i] - p[0][i + 1];
  24. if (p[1][i] < 0) {
  25. p[1][i] = -p[1][i];
  26. }
  27. *pa++ = p[1][i];
  28. }
  29. // swap
  30. swap = p[0];
  31. p[0] = p[1];
  32. p[1] = swap;
  33. }
  34. b |= 1 << (p[0][0] - 1);
  35.  
  36. if (b == ~(0xFFFFFFFF << ALL_N)) {
  37. pa = &ans[0];
  38. printf("---\n");
  39. for (j = TOP_WIDTH; j >= 1; j--) {
  40. printf("%*s", (TOP_WIDTH - j) * 2, "");
  41. for (i = 0; i < j; i++) {
  42. printf("%2d ", *pa++);
  43. }
  44. printf("\n");
  45. }
  46. }
  47. }
  48.  
  49. // 並べ替える
  50. // (len個の配列の右n個を左にスライドして再帰)
  51. void narabe(int *d, int len, int n)
  52. {
  53. int i, j;
  54. int tmp;
  55.  
  56. if (n <= (ALL_N - TOP_WIDTH)) {
  57. kekka_shori(d, len);
  58. return;
  59. }
  60. for (j = 0; j < n; j++) {
  61. narabe(d, len, n - 1);
  62. tmp = d[len - n];
  63. for (i = 0; i < n - 1; i++) {
  64. d[len - n + i] = d[len - n + i + 1];
  65. }
  66. d[len - n + i] = tmp;
  67. }
  68. }
  69.  
  70. int main()
  71. {
  72. int d[ALL_N];
  73. int i;
  74.  
  75. if (ALL_N > 32) {
  76. fprintf(stderr, "現状、総数32個までしか計算出来ないので %d個は無理です\n", ALL_N);
  77. return 1;
  78. }
  79. for (i = 0; i < ALL_N; i++) {
  80. d[i] = i + 1;
  81. }
  82.  
  83. narabe(d, ALL_N, ALL_N);
  84. printf("\n");
  85. return 0;
  86. }
Success #stdin #stdout 0.04s 1720KB
stdin
Standard input is empty
stdout
---
 6  14  15   3  13  
   8   1  12  10  
     7  11   2  
       4   9  
         5  
---
13   3  15  14   6  
  10  12   1   8  
     2  11   7  
       9   4  
         5