1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#ifndef MOVES_H
#define MOVES_H
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include "cube.h"
#include "utils.h"
#define NMOVES (z3+1)
typedef enum {
NULLMOVE,
U, U2, U3, D, D2, D3, R, R2, R3, L, L2, L3, F, F2, F3, B, B2, B3,
Uw, Uw2, Uw3, Dw, Dw2, Dw3, Rw, Rw2, Rw3,
Lw, Lw2, Lw3, Fw, Fw2, Fw3, Bw, Bw2, Bw3,
M, M2, M3, S, S2, S3, E, E2, E3,
x, x2, x3, y, y2, y3, z, z2, z3,
} Move;
/* An alg is an array of "NissMoves", which can be on normal or on inverse. */
typedef struct { bool inverse; Move m; } NissMove;
/* Movesets */
extern bool standard_moveset[NMOVES];
extern bool commute[NMOVES][NMOVES];
extern bool possible_next[NMOVES][NMOVES][NMOVES];
extern Move inverse[NMOVES];
extern NissMove rotation_algs[24][3]; /* Same order as transformations */
int len(NissMove *alg);
int copy_alg(NissMove *src, NissMove *dest); /*return number of moves copied */
int invert_alg(NissMove *src, NissMove *dest);
int concat(NissMove *src1, NissMove *src2, NissMove *dest);
void print_moves(NissMove *alg);
int read_moves(char *str, NissMove *alg, int n); /* reads at most n moves */
void cleanup(NissMove *src, int n); /* rewrites using basic moves, at most n */
bool is_solved_up_to_reorient(Cube cube);
Cube move_cube(Move m, Cube cube);
Cube apply_alg(NissMove *alg, Cube cube);
/* Merge the following two?
always in this order */
void init_ttables(bool read, bool write);
void init_aux_tables();
#endif
|