Advertisement
STANAANDREY

arrang tpa

Apr 15th, 2023
769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <assert.h>
  5. #define CHECK_ALLOC(p) if (p == NULL) {perror(""); exit(-1);}
  6.  
  7. void swap(int *a, int *b) {
  8.   int aux = *a;
  9.   *a = *b;
  10.   *b = aux;
  11. }
  12.  
  13. int* readArr(int *n) {
  14.   scanf("%d", n);
  15.   int *arr = (int*)malloc(sizeof(int) * *n);
  16.   CHECK_ALLOC(arr);
  17.   for (int i = 0; i < *n; i++) {
  18.     scanf("%d", arr + i);
  19.   }
  20.   return arr;
  21. }
  22.  
  23. void printArr(int arr[], int size) {
  24.   for (int i = 0; i < size; i++) {
  25.     printf("%d ", arr[i]);
  26.   }
  27.   printf("\n");
  28. }
  29.  
  30. bool ok(int index, int arrang[]) {
  31.   for (int i = 0; i < index; i++) {
  32.     if (arrang[index] == arrang[i]) {
  33.       return false;
  34.     }
  35.   }
  36.   return true;
  37. }
  38.  
  39. void mkAndPrintArrangements(int n, int k, const int arr[], int arrang[], int index, int *cnt) {
  40.   if (index == k) {
  41.     printf("#%d: ", ++*cnt);
  42.     printArr(arrang, k);
  43.     return;
  44.   }
  45.   for (int i = 0; i < n; i++) {
  46.     arrang[index] = arr[i];
  47.     if (ok(index, arrang)) {
  48.       mkAndPrintArrangements(n, k, arr, arrang, index + 1, cnt);
  49.     }
  50.   }
  51. }
  52.  
  53. int main(void) {
  54.   int n, k;
  55.   int *arr = readArr(&n);
  56.   scanf("%d", &k);
  57.   int *arrang = (int*)malloc(sizeof(int) * k);
  58.   if (arrang == NULL) {
  59.     free(arr);
  60.     perror("");
  61.     exit(-1);
  62.   }
  63.   int cnt = 0;
  64.   mkAndPrintArrangements(n, k, arr, arrang, 0, &cnt);
  65.   free(arr);
  66.   free(arrang);
  67.   return 0;
  68. }
  69.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement