12
struct microsoft_rand_struct
17
typedef struct microsoft_rand_struct microsoft_rand_t;
19
microsoft_rand_t * microsoft_rand_alloc(unsigned int seed)
21
microsoft_rand_t * ret;
23
ret = malloc(sizeof(microsoft_rand_t));
24
ret->seed = (long)seed;
29
void microsoft_rand_free(microsoft_rand_t * rand)
34
int microsoft_rand_rand(microsoft_rand_t * rand)
36
rand->seed = (rand->seed * 214013 + 2531011);
37
return (rand->seed >> 16) & 0x7fff;
42
#define BLACK 0 /* COLOUR(card) */
45
#define ACE 0 /* VALUE(card) */
48
#define CLUB 0 /* SUIT(card) */
53
#define SUIT(card) ((card) % 4)
54
#define VALUE(card) ((card) / 4)
55
#define COLOUR(card) (SUIT(card) == DIAMOND || SUIT(card) == HEART)
58
#define MAXCOL 9 /* includes top row as column 0 */
60
char * card_to_string(char * s, CARD card, int not_append_ws)
62
int suit = SUIT(card);
63
int v = VALUE(card)+1;
75
strcpy(s, (v == 11)?"J":((v == 12)?"Q":"K"));
102
char * get_board(int gamenumber)
105
CARD card[MAXCOL][MAXPOS]; /* current layout of cards, CARDs are ints */
107
int i, j; /* generic counters */
108
int wLeft = 52; /* cards left to be chosen in shuffle */
109
CARD deck[52]; /* deck of 52 unique cards */
112
microsoft_rand_t * randomizer;
120
for (i = 0; i < 52; i++) /* put unique card in each deck loc. */
125
randomizer = microsoft_rand_alloc(gamenumber); /* gamenumber is seed for rand() */
126
for (i = 0; i < 52; i++)
128
j = microsoft_rand_rand(randomizer) % wLeft;
129
card[(i%8)+1][i/8] = deck[j];
130
deck[j] = deck[--wLeft];
133
microsoft_rand_free(randomizer);
140
char card_string[10];
142
for(stack=1 ; stack<9 ; stack++ )
144
for(c=0 ; c < (6+(stack<5)) ; c++)
146
sprintf(ret+strlen(ret), "%s",
154
sprintf(ret+strlen(ret), "%s", "\n");
161
#define LIMIT_STEP 500
162
#define LIMIT_MAX 50000
164
int main(int argc, char * argv[])
167
/* char buffer[2048]; */
175
int start_board, end_board, stop_at;
179
start_board = atoi(argv[1]);
180
end_board = atoi(argv[2]);
181
stop_at = atoi(argv[3]);
183
/* for(board_num=1;board_num<100000;board_num++) */
184
for(board_num=start_board;board_num<=end_board;board_num++)
186
user = freecell_solver_user_alloc();
187
freecell_solver_user_set_solving_method(
193
freecell_solver_user_set_solution_optimization(
199
buffer = get_board(board_num);
203
freecell_solver_user_limit_iterations(user, limit);
205
ret = freecell_solver_user_solve_board(user, buffer);
207
printf("%i, %i\n", board_num, limit);
212
while ((ret == FCS_STATE_SUSPEND_PROCESS) && (limit < LIMIT_MAX))
215
freecell_solver_user_limit_iterations(user, limit);
216
ret = freecell_solver_user_resume_solution(user);
217
printf("%i, %i\n", board_num, limit);
223
if (ret == FCS_STATE_WAS_SOLVED)
225
while (freecell_solver_user_get_next_move(user, &move) == 0)
227
printf("%i\n", (int)fcs_move_get_type(move)); printf("%i\n",
228
(int)fcs_move_get_num_cards_in_seq(move));
235
freecell_solver_user_free(user);
237
if (board_num % stop_at == 0)
239
printf ("Press Return to continue:\n");
240
fgets(line, sizeof(line), stdin);