2 Generic matrix transformations
21 u8 dst
[static TOTAL_BOARD_SIZ
],
22 const u8 src
[static TOTAL_BOARD_SIZ
],
26 assert(rotations
< 4);
33 memcpy(dst
, src
, side_len
* side_len
);
38 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
39 move_to_coord(m
, &x
, &y
);
40 dst
[m
] = src
[coord_to_move(side_len
- y
, x
)];
46 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
47 dst
[m
] = src
[TOTAL_BOARD_SIZ
- 1 - m
];
53 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
54 move_to_coord(m
, &x
, &y
);
55 dst
[m
] = src
[coord_to_move(y
, side_len
- x
)];
62 Rotate contents of an out_board structure.
65 out_board
* restrict dst
,
66 const out_board
* restrict src
,
69 assert(rotations
< 4);
76 memcpy(dst
->value
, src
->value
, TOTAL_BOARD_SIZ
* sizeof(double));
77 memcpy(dst
->tested
, src
->tested
, TOTAL_BOARD_SIZ
);
80 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
81 move_to_coord(m
, &x
, &y
);
82 move n
= coord_to_move(BOARD_SIZ
- 1 - y
, x
);
83 dst
->value
[m
] = src
->value
[n
];
84 dst
->tested
[m
] = src
->tested
[n
];
88 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
89 dst
->value
[m
] = src
->value
[TOTAL_BOARD_SIZ
- 1 - m
];
90 dst
->tested
[m
] = src
->tested
[TOTAL_BOARD_SIZ
- 1 - m
];
94 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
95 move_to_coord(m
, &x
, &y
);
96 move n
= coord_to_move(y
, BOARD_SIZ
- 1 - x
);
97 dst
->value
[m
] = src
->value
[n
];
98 dst
->tested
[m
] = src
->tested
[n
];
103 dst
->pass
= src
->pass
;
107 Flips a square matrix.
110 u8 dst
[static TOTAL_BOARD_SIZ
],
111 const u8 src
[static TOTAL_BOARD_SIZ
],
119 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
120 move_to_coord(m
, &x
, &y
);
121 dst
[m
] = src
[coord_to_move(side_len
- x
, y
)];
126 Flips the board contents of an out_board structure.
129 out_board
* restrict dst
,
130 const out_board
* restrict src
135 for (move m
= 0; m
< TOTAL_BOARD_SIZ
; ++m
) {
136 move_to_coord(m
, &x
, &y
);
137 move n
= coord_to_move(BOARD_SIZ
- 1 - x
, y
);
138 dst
->value
[m
] = src
->value
[n
];
139 dst
->tested
[m
] = src
->tested
[n
];
142 dst
->pass
= src
->pass
;
147 Produces the move correspondent in the transformed matrix.
155 if (method
== NOREDUCE
|| *x
>= BOARD_SIZ
) {
160 method
= method
* -1;
171 oy
= side_len
- 1 - *x
;
174 ox
= side_len
- 1 - *x
;
175 oy
= side_len
- 1 - *y
;
178 ox
= side_len
- 1 - *y
;
182 ox
= side_len
- 1 - *x
;
187 iy
= side_len
- 1 - *x
;
189 ox
= side_len
- 1 - ix
;
193 ix
= side_len
- 1 - *x
;
194 iy
= side_len
- 1 - *y
;
196 ox
= side_len
- 1 - ix
;
200 ix
= side_len
- 1 - *y
;
203 ox
= side_len
- 1 - ix
;