fork download
  1. #include<stdio.h>
  2.  
  3. // 並べ替え結果処理
  4. void kekka_shori(int *d, int len)
  5. {
  6. int i, j, tmp[2][5], *p[2], *swap, ans[15], *pa = &ans[0];
  7. unsigned short b = 0x0000;
  8.  
  9. for (i = 0; i < 5; i++) {
  10. *pa++ = tmp[0][i] = d[i];
  11. }
  12. p[0] = &tmp[0][0];
  13. p[1] = &tmp[1][0];
  14. for (j = 5; j >= 2; j--) {
  15. for (i = 0; i < j; i++) {
  16. b |= 1 << (p[0][i] - 1);
  17. }
  18. for (i = 0; i < j - 1; i++) {
  19. p[1][i] = p[0][i] - p[0][i + 1];
  20. if (p[1][i] < 0) {
  21. p[1][i] = -p[1][i];
  22. }
  23. *pa++ = p[1][i];
  24. }
  25. // swap
  26. swap = p[0];
  27. p[0] = p[1];
  28. p[1] = swap;
  29. }
  30. b |= 1 << (p[0][0] - 1);
  31.  
  32. if (b == 0x7FFF) {
  33. pa = &ans[0];
  34. printf("---\n");
  35. for (j = 5; j >= 1; j--) {
  36. printf("%*s", (5 - j) * 2, "");
  37. for (i = 0; i < j; i++) {
  38. printf("%2d ", *pa++);
  39. }
  40. printf("\n");
  41. }
  42. }
  43. }
  44.  
  45. // 並べ替える
  46. // (len個の配列の右n個を左にスライドして再帰)
  47. void narabe(int *d, int len, int n)
  48. {
  49. int i, j;
  50. int tmp;
  51.  
  52. if (n <= 10) {
  53. kekka_shori(d, len);
  54. return;
  55. }
  56. for (j = 0; j < n; j++) {
  57. narabe(d, len, n - 1);
  58. tmp = d[len - n];
  59. for (i = 0; i < n - 1; i++) {
  60. d[len - n + i] = d[len - n + i + 1];
  61. }
  62. d[len - n + i] = tmp;
  63. }
  64. }
  65.  
  66. int main()
  67. {
  68. int d[15];
  69. int i;
  70.  
  71. for (i = 0; i < 15; i++) {
  72. d[i] = i + 1;
  73. }
  74.  
  75. narabe(d, 15, 15);
  76. printf("\n");
  77. return 0;
  78. }
Success #stdin #stdout 0.05s 1676KB
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