diff options
Diffstat (limited to 'src/solvers/coord/solve.h')
| -rw-r--r-- | src/solvers/coord/solve.h | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/src/solvers/coord/solve.h b/src/solvers/coord/solve.h index e954aac..190ac1f 100644 --- a/src/solvers/coord/solve.h +++ b/src/solvers/coord/solve.h | |||
| @@ -20,8 +20,9 @@ typedef struct { | |||
| 20 | 20 | ||
| 21 | STATIC int64_t solve_coord(cube_t, coord_t *, uint8_t, uint8_t, uint8_t, | 21 | STATIC int64_t solve_coord(cube_t, coord_t *, uint8_t, uint8_t, uint8_t, |
| 22 | uint8_t, uint64_t, int, int, uint64_t, const void *, uint64_t, char *); | 22 | uint8_t, uint64_t, int, int, uint64_t, const void *, uint64_t, char *); |
| 23 | STATIC int64_t solve_coord_dispatch(cube_t, const char *, uint8_t, uint8_t, | 23 | STATIC int64_t solve_coord_dispatch(cube_t, const char *, const char *, |
| 24 | uint8_t, uint64_t, int, int, uint64_t, const void *, uint64_t, char *); | 24 | uint8_t, uint8_t, uint8_t, uint64_t, int, int, uint64_t, const void *, |
| 25 | uint64_t, char *); | ||
| 25 | STATIC bool solve_coord_appendchar(char *, uint64_t, uint64_t *, char); | 26 | STATIC bool solve_coord_appendchar(char *, uint64_t, uint64_t *, char); |
| 26 | STATIC int64_t solve_coord_appendsolution(dfsarg_solve_coord_t *); | 27 | STATIC int64_t solve_coord_appendsolution(dfsarg_solve_coord_t *); |
| 27 | STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *); | 28 | STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *); |
| @@ -29,7 +30,9 @@ STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *); | |||
| 29 | STATIC int64_t | 30 | STATIC int64_t |
| 30 | solve_coord_appendsolution(dfsarg_solve_coord_t *arg) | 31 | solve_coord_appendsolution(dfsarg_solve_coord_t *arg) |
| 31 | { | 32 | { |
| 32 | uint8_t i, t, tmoves[MAXLEN_COORDSOL]; | 33 | uint8_t i, t, l, tmoves[MAXLEN_COORDSOL]; |
| 34 | char *m; | ||
| 35 | int64_t strl; | ||
| 33 | 36 | ||
| 34 | if (*arg->nsols >= arg->maxsolutions || | 37 | if (*arg->nsols >= arg->maxsolutions || |
| 35 | arg->nmoves > *arg->shortest_sol + arg->optimal) | 38 | arg->nmoves > *arg->shortest_sol + arg->optimal) |
| @@ -41,9 +44,26 @@ solve_coord_appendsolution(dfsarg_solve_coord_t *arg) | |||
| 41 | for (i = 0; i < arg->nmoves; i++) | 44 | for (i = 0; i < arg->nmoves; i++) |
| 42 | tmoves[i] = transform_move(arg->moves[i], t); | 45 | tmoves[i] = transform_move(arg->moves[i], t); |
| 43 | 46 | ||
| 44 | /* TODO append tmoves[] */ | 47 | l = arg->solutions_size - *arg->solutions_used; |
| 48 | m = *arg->solutions + *arg->solutions_used; | ||
| 49 | strl = writemoves(tmoves, arg->nmoves, l, m); | ||
| 50 | if (strl < 0) | ||
| 51 | goto solve_coord_appendsolution_error; | ||
| 52 | |||
| 53 | *arg->solutions_used += MAX(0, strl-1); | ||
| 54 | |||
| 55 | if (!solve_coord_appendchar( | ||
| 56 | *arg->solutions, arg->solutions_size, arg->solutions_used, '\n')) | ||
| 57 | goto solve_coord_appendsolution_error; | ||
| 58 | |||
| 59 | (*arg->nsols)++; | ||
| 60 | *arg->shortest_sol = MIN(*arg->shortest_sol, arg->nmoves); | ||
| 45 | 61 | ||
| 46 | return 1; | 62 | return 1; |
| 63 | |||
| 64 | solve_coord_appendsolution_error: | ||
| 65 | LOG("Could not append solution to buffer: size too small\n"); | ||
| 66 | return NISSY_ERROR_BUFFER_SIZE; | ||
| 47 | } | 67 | } |
| 48 | 68 | ||
| 49 | STATIC bool | 69 | STATIC bool |
| @@ -61,8 +81,11 @@ solve_coord_appendchar(char *s, uint64_t s_size, uint64_t *s_used, char c) | |||
| 61 | STATIC int64_t | 81 | STATIC int64_t |
| 62 | solve_coord_dfs(dfsarg_solve_coord_t *arg) | 82 | solve_coord_dfs(dfsarg_solve_coord_t *arg) |
| 63 | { | 83 | { |
| 84 | uint8_t m, pval; | ||
| 85 | uint32_t mm; | ||
| 64 | uint64_t coord; | 86 | uint64_t coord; |
| 65 | uint8_t pval; | 87 | int64_t n, ret; |
| 88 | cube_t backup_cube; | ||
| 66 | 89 | ||
| 67 | coord = arg->coord->coord(arg->cube, arg->coord_data); | 90 | coord = arg->coord->coord(arg->cube, arg->coord_data); |
| 68 | 91 | ||
| @@ -76,8 +99,23 @@ solve_coord_dfs(dfsarg_solve_coord_t *arg) | |||
| 76 | if (arg->nmoves + pval > arg->depth) | 99 | if (arg->nmoves + pval > arg->depth) |
| 77 | return 0; | 100 | return 0; |
| 78 | 101 | ||
| 79 | /* TODO recursive call */ | 102 | backup_cube = arg->cube; |
| 80 | /* Is allowednextmove available here? */ | 103 | |
| 104 | ret = 0; | ||
| 105 | mm = allowednextmove_mask(arg->moves, arg->nmoves); | ||
| 106 | arg->nmoves++; | ||
| 107 | for (m = 0; m < 18; m++) { | ||
| 108 | if (!(mm & (1 << m))) | ||
| 109 | continue; | ||
| 110 | |||
| 111 | arg->moves[arg->nmoves-1] = m; | ||
| 112 | arg->cube = move(backup_cube, m); | ||
| 113 | n = solve_coord_dfs(arg); | ||
| 114 | if (n < 0) | ||
| 115 | return n; | ||
| 116 | ret += n; | ||
| 117 | } | ||
| 118 | arg->nmoves--; | ||
| 81 | 119 | ||
| 82 | return 0; | 120 | return 0; |
| 83 | } | 121 | } |
| @@ -85,7 +123,8 @@ solve_coord_dfs(dfsarg_solve_coord_t *arg) | |||
| 85 | STATIC int64_t | 123 | STATIC int64_t |
| 86 | solve_coord_dispatch( | 124 | solve_coord_dispatch( |
| 87 | cube_t cube, | 125 | cube_t cube, |
| 88 | const char *coord_axis, | 126 | const char *coordstr, |
| 127 | const char *options, | ||
| 89 | uint8_t nissflag, | 128 | uint8_t nissflag, |
| 90 | uint8_t minmoves, | 129 | uint8_t minmoves, |
| 91 | uint8_t maxmoves, | 130 | uint8_t maxmoves, |
| @@ -98,23 +137,19 @@ solve_coord_dispatch( | |||
| 98 | char *sols | 137 | char *sols |
| 99 | ) | 138 | ) |
| 100 | { | 139 | { |
| 101 | int i, n; | ||
| 102 | coord_t *coord; | 140 | coord_t *coord; |
| 103 | uint8_t axis; | 141 | uint8_t axis; |
| 104 | 142 | ||
| 105 | n = strlen(coord_axis); | 143 | coord = parse_coord(coordstr, strlen(coordstr)); |
| 106 | for (i = 0; coord_axis[i] != ' ' && coord_axis[i] != '\0'; i++) ; | 144 | axis = parse_axis(options, strlen(options)); |
| 107 | |||
| 108 | coord = parse_coord(coord_axis, i); | ||
| 109 | axis = parse_axis(coord_axis + i + 1, n - i - 1); | ||
| 110 | 145 | ||
| 111 | if (coord == NULL) { | 146 | if (coord == NULL) { |
| 112 | LOG("Could not parse coordinate '%s'\n", coord_axis); | 147 | LOG("Could not parse coordinate '%s'\n", coordstr); |
| 113 | return NISSY_ERROR_INVALID_SOLVER; | 148 | return NISSY_ERROR_INVALID_SOLVER; |
| 114 | } | 149 | } |
| 115 | 150 | ||
| 116 | if (axis == UINT8_ERROR) { | 151 | if (axis == UINT8_ERROR) { |
| 117 | LOG("Could not parse axis from '%s'\n", coord_axis); | 152 | LOG("Could not parse axis from options '%s'\n", options); |
| 118 | return NISSY_ERROR_INVALID_SOLVER; | 153 | return NISSY_ERROR_INVALID_SOLVER; |
| 119 | } | 154 | } |
| 120 | 155 | ||
| @@ -165,8 +200,8 @@ solve_coord( | |||
| 165 | nsols = 0; | 200 | nsols = 0; |
| 166 | sols_used = 0; | 201 | sols_used = 0; |
| 167 | shortest_sol = MAXLEN_COORDSOL + 1; | 202 | shortest_sol = MAXLEN_COORDSOL + 1; |
| 168 | c = transform(cube, t); | ||
| 169 | t = coord->axistrans[axis]; | 203 | t = coord->axistrans[axis]; |
| 204 | c = transform(cube, t); | ||
| 170 | 205 | ||
| 171 | arg = (dfsarg_solve_coord_t) { | 206 | arg = (dfsarg_solve_coord_t) { |
| 172 | .cube = c, | 207 | .cube = c, |
