fork(3) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void dfs(int arr[], int pos, int take_num, int n, int next, int is_first) {
  5. if (pos >= take_num) {
  6. /* 1個の組み合わせが最後まで求まった */
  7. int i;
  8. if (is_first == 0) printf(", ");
  9. /* 組み合わせを出力する */
  10. printf("{ ");
  11. for (i = 0; i < take_num; i++) {
  12. if (i > 0) putchar(',');
  13. if (take_num == n) {
  14. printf("%d", arr[i] + 1);
  15. } else {
  16. printf("%d", arr[i]);
  17. }
  18. }
  19. printf(" }");
  20. if (take_num == 1 && n > 1 && is_first) putchar(' ');
  21. } else {
  22. int i;
  23. /* 組み合わせを作る数字が足りないので、枝刈りを行う */
  24. if (n - next + 1 < take_num - pos) return;
  25. /* 次の数字を探索する */
  26. for (i = next; i < n; i++) {
  27. arr[pos] = i;
  28. dfs(arr, pos + 1, take_num, n, i + 1, is_first);
  29. is_first = 0;
  30. }
  31. }
  32. }
  33.  
  34. int main(void) {
  35. int n;
  36. int i;
  37. int *arr;
  38. /* 入力 */
  39. if (scanf("%d", &n) != 1 || n <= 0) {
  40. puts("bad input");
  41. return 1;
  42. }
  43. /* メモリ確保 */
  44. arr = (int *) malloc(sizeof(int) * n);
  45. if (arr == NULL) {
  46. puts("memory allocate error");
  47. return 1;
  48. }
  49. /* 各rごとに組み合わせを取得する */
  50. for (i = 1; i <= n; i++) {
  51. dfs(arr, 0, i, n, 0, 1);
  52. putchar('\n');
  53. }
  54. free(arr);
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 2384KB
stdin
4
stdout
{ 0 } , { 1 }, { 2 }, { 3 }
{ 0,1 }, { 0,2 }, { 0,3 }, { 1,2 }, { 1,3 }, { 2,3 }
{ 0,1,2 }, { 0,1,3 }, { 0,2,3 }, { 1,2,3 }
{ 1,2,3,4 }