solver.c 940 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include "rubiks.h"
  4. static void solver_iterate(t_rubiks *r, t_stack *result, size_t maxDeep, t_stack **sol)
  5. {
  6. char movType;
  7. for (movType =0; movType < 18; ++movType)
  8. {
  9. if (movType == stack_value(result))
  10. continue;
  11. stack_push(result, movType);
  12. rubik_apply(r, movType);
  13. if (rubik_isDone(r))
  14. {
  15. if (*sol == NULL || stack_length(result) < stack_length(*sol))
  16. {
  17. if (*sol)
  18. stack_destroy(*sol);
  19. *sol = stack_copy(result);
  20. maxDeep = stack_length(result);
  21. }
  22. }
  23. else if (stack_length(result) < maxDeep)
  24. solver_iterate(r, result, maxDeep, sol);
  25. stack_pop(result);
  26. rubik_reverse(r, movType);
  27. }
  28. }
  29. t_stack *doSolve(char buffer[54], int maxDeep)
  30. {
  31. t_rubiks *r = rubik_create(buffer);
  32. t_stack *result = stack_create();
  33. t_stack *solution = NULL;
  34. solver_iterate(r, result, (size_t) maxDeep, &solution);
  35. free(r);
  36. stack_destroy(result);
  37. return solution;
  38. }