aaaaaa123456789 icon

JV programming challenges, week 5, challenge 1

aaaaaa123456789 | PRO | 12/21/13 07:26:11 PM UTC | 0 ⭐ | 414 👁️ | Never ⏰ | []
C |

1.33 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include "common.h"
 
void print_permutations(const char *);
void print_next_permutations(const char *, const unsigned *);
 
int main (void) {
  printf("Input a word: ");
  char * line = get_line(NULL);
  if (!strlen(line)) {
    free(line);
    return 1;
  }
  print_permutations(line);
  free(line);
  return 0;
}
  
void print_permutations (const char * word) {
  unsigned count[256];
  const char * current;
  memset(count, 0, 256 * sizeof(unsigned));
  for (current = word; *current; current ++) count[*current] ++;
  *count = strlen(word);
  print_next_permutations("", count);
}
 
void print_next_permutations (const char * head, const unsigned * list) {
  if (!*list) {
    printf("%s\n", head);
    return;
  }
  unsigned insert_point = strlen(head);
  int character;
  char * string = malloc(insert_point + 2);
  unsigned new_count[256];
  memcpy(new_count, list, sizeof(unsigned) * 256);
  memcpy(string, head, insert_point);
  string[insert_point + 1] = 0;
  (*new_count) --;
  for (character = 1; character < 256; character ++) {
    if (!new_count[character]) continue;
    new_count[character] --;
    string[insert_point] = character;
    print_next_permutations(string, new_count);
    new_count[character] ++;
  }
  free(string);
}

Comments