| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #include <math.h>
- #include <stdlib.h>
- #include "rubiks.h"
- static void solver_iterate(t_rubiks *r, t_stack *result, size_t maxDeep, t_stack **sol)
- {
- char movType;
- for (movType =0; movType < 18; ++movType)
- {
- if (movType == stack_value(result))
- continue;
- stack_push(result, movType);
- rubik_apply(r, movType);
- if (rubik_isDone(r))
- {
- if (*sol == NULL || stack_length(result) < stack_length(*sol))
- {
- if (*sol)
- stack_destroy(*sol);
- *sol = stack_copy(result);
- maxDeep = stack_length(result);
- }
- }
- else if (stack_length(result) < maxDeep)
- solver_iterate(r, result, maxDeep, sol);
- stack_pop(result);
- rubik_reverse(r, movType);
- }
- }
- t_stack *doSolve(char buffer[54], int maxDeep)
- {
- t_rubiks *r = rubik_create(buffer);
- t_stack *result = stack_create();
- t_stack *solution = NULL;
- solver_iterate(r, result, (size_t) maxDeep, &solution);
- free(r);
- stack_destroy(result);
- return solution;
- }
|