aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/coord/solve.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/coord/solve.h')
-rw-r--r--src/solvers/coord/solve.h69
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
21STATIC int64_t solve_coord(cube_t, coord_t *, uint8_t, uint8_t, uint8_t, 21STATIC 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 *);
23STATIC int64_t solve_coord_dispatch(cube_t, const char *, uint8_t, uint8_t, 23STATIC 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 *);
25STATIC bool solve_coord_appendchar(char *, uint64_t, uint64_t *, char); 26STATIC bool solve_coord_appendchar(char *, uint64_t, uint64_t *, char);
26STATIC int64_t solve_coord_appendsolution(dfsarg_solve_coord_t *); 27STATIC int64_t solve_coord_appendsolution(dfsarg_solve_coord_t *);
27STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *); 28STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *);
@@ -29,7 +30,9 @@ STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *);
29STATIC int64_t 30STATIC int64_t
30solve_coord_appendsolution(dfsarg_solve_coord_t *arg) 31solve_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
64solve_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
49STATIC bool 69STATIC bool
@@ -61,8 +81,11 @@ solve_coord_appendchar(char *s, uint64_t s_size, uint64_t *s_used, char c)
61STATIC int64_t 81STATIC int64_t
62solve_coord_dfs(dfsarg_solve_coord_t *arg) 82solve_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)
85STATIC int64_t 123STATIC int64_t
86solve_coord_dispatch( 124solve_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,

Generated with cgit - Back to sebastiano.tronto.net