#include #include #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; }