aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c20
-rw-r--r--src/solver.c50
-rw-r--r--src/solver.h16
3 files changed, 43 insertions, 43 deletions
diff --git a/src/main.c b/src/main.c
index 30fe517..0a29d0e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -68,7 +68,7 @@ int read_moves_from_argument(int n, char tok[][100], int *dst) {
68 return (r != -1) ? r : read_moves_from_tok(n, tok, dst); 68 return (r != -1) ? r : read_moves_from_tok(n, tok, dst);
69} 69}
70 70
71void print_results(int n, int res[][21]) { 71void print_results(int n, int res[][30]) {
72 if (n == -1) 72 if (n == -1)
73 printf("Pre-conditions not satisfied (or other error).\n"); 73 printf("Pre-conditions not satisfied (or other error).\n");
74 74
@@ -314,7 +314,7 @@ void pic_cmd(int n, char cmdtok[][100]) {
314} 314}
315 315
316void solve_cmd(int n, char cmdtok[][100]) { 316void solve_cmd(int n, char cmdtok[][100]) {
317 int m = 1, b = 20, optimal = 0; 317 int m = 1, b = 25, optimal = 0;
318 int scram[255] = {[0] = 0}; 318 int scram[255] = {[0] = 0};
319 int scram_unnissed[255]; 319 int scram_unnissed[255];
320 320
@@ -349,7 +349,7 @@ void solve_cmd(int n, char cmdtok[][100]) {
349 349
350 /* Call solver and print results */ 350 /* Call solver and print results */
351 unniss(scram, scram_unnissed); 351 unniss(scram, scram_unnissed);
352 int sol[m+2][21]; 352 int sol[m+2][30];
353 int s = solve_scram(scram_unnissed, sol, m, b, optimal); 353 int s = solve_scram(scram_unnissed, sol, m, b, optimal);
354 print_results(s, sol); 354 print_results(s, sol);
355} 355}
@@ -382,7 +382,7 @@ void replace_cmd(int n, char cmdtok[][100]) {
382 382
383 unniss(scram, scram_unnissed); 383 unniss(scram, scram_unnissed);
384 int l = len(scram_unnissed); 384 int l = len(scram_unnissed);
385 int aux1[255], aux2[15][21], aux3[21]; 385 int aux1[255], aux2[15][30], aux3[30];
386 for (int i = 0; i < l; i++) { 386 for (int i = 0; i < l; i++) {
387 for (int j = 2; j <= m && i + j <= l; j++) { 387 for (int j = 2; j <= m && i + j <= l; j++) {
388 copy_moves(scram_unnissed+i, aux1); 388 copy_moves(scram_unnissed+i, aux1);
@@ -459,7 +459,7 @@ void eo_cmd(int n, char cmdtok[][100]) {
459 unniss(scram, scram_unnissed); 459 unniss(scram, scram_unnissed);
460 460
461 /* Call solver and print results */ 461 /* Call solver and print results */
462 int eo_list[m+5][21]; 462 int eo_list[m+5][30];
463 int neo = eo_scram_spam(scram_unnissed, eo_list, fb, rl, ud, m, b, niss, 463 int neo = eo_scram_spam(scram_unnissed, eo_list, fb, rl, ud, m, b, niss,
464 hide); 464 hide);
465 print_results(neo, eo_list); 465 print_results(neo, eo_list);
@@ -531,7 +531,7 @@ void dr_cmd(int n, char cmdtok[][100]) {
531 unniss(scram, scram_unnissed); 531 unniss(scram, scram_unnissed);
532 532
533 /* Call solver */ 533 /* Call solver */
534 int dr_list[m+5][21], ndr; 534 int dr_list[m+5][30], ndr;
535 if (from) { 535 if (from) {
536 ndr = drfrom_scram_spam(scram_unnissed, dr_list, from, fb, rl, ud, 536 ndr = drfrom_scram_spam(scram_unnissed, dr_list, from, fb, rl, ud,
537 m, b, niss, hide); 537 m, b, niss, hide);
@@ -600,7 +600,7 @@ void htr_cmd(int n, char cmdtok[][100]) {
600 unniss(scram, scram_unnissed); 600 unniss(scram, scram_unnissed);
601 601
602 /* Call solver */ 602 /* Call solver */
603 int htr_list[m+5][21], nhtr; 603 int htr_list[m+5][30], nhtr;
604 nhtr = htr_scram_spam(scram_unnissed, htr_list, from, m, b, niss, hide); 604 nhtr = htr_scram_spam(scram_unnissed, htr_list, from, m, b, niss, hide);
605 print_results(nhtr, htr_list); 605 print_results(nhtr, htr_list);
606} 606}
@@ -652,7 +652,7 @@ void drfinish_cmd(int n, char cmdtok[][100]) {
652 unniss(scram, scram_unnissed); 652 unniss(scram, scram_unnissed);
653 653
654 /* Call solver */ 654 /* Call solver */
655 int c_list[m+5][21], nc; 655 int c_list[m+5][30], nc;
656 nc = dr_finish_scram_spam(scram_unnissed, c_list, from, m, b); 656 nc = dr_finish_scram_spam(scram_unnissed, c_list, from, m, b);
657 print_results(nc, c_list); 657 print_results(nc, c_list);
658} 658}
@@ -693,7 +693,7 @@ void htrfinish_cmd(int n, char cmdtok[][100]) {
693 unniss(scram, scram_unnissed); 693 unniss(scram, scram_unnissed);
694 694
695 /* Call solver */ 695 /* Call solver */
696 int c_list[m+5][21], nc; 696 int c_list[m+5][30], nc;
697 nc = htr_finish_scram_spam(scram_unnissed, c_list, m, b); 697 nc = htr_finish_scram_spam(scram_unnissed, c_list, m, b);
698 print_results(nc, c_list); 698 print_results(nc, c_list);
699} 699}
@@ -747,7 +747,7 @@ void drcorners_cmd(int n, char cmdtok[][100]) {
747 unniss(scram, scram_unnissed); 747 unniss(scram, scram_unnissed);
748 748
749 /* Call solver */ 749 /* Call solver */
750 int c_list[m+5][21], nc; 750 int c_list[m+5][30], nc;
751 nc = dr_corners_scram_spam(scram_unnissed, c_list, from, m, b, ignore); 751 nc = dr_corners_scram_spam(scram_unnissed, c_list, from, m, b, ignore);
752 print_results(nc, c_list); 752 print_results(nc, c_list);
753} 753}
diff --git a/src/solver.c b/src/solver.c
index c2b3ff5..d918a54 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -9,7 +9,7 @@
9 9
10/* Applies inverse of moves, inverse of prev_moves and then inverse of scramble 10/* Applies inverse of moves, inverse of prev_moves and then inverse of scramble
11 * and returns a coordinate determined by t_table. */ 11 * and returns a coordinate determined by t_table. */
12int premoves_inverse(int moves[21], int scramble[], int prev_moves[21], 12int premoves_inverse(int moves[30], int scramble[], int prev_moves[30],
13 int t_table[][19]) { 13 int t_table[][19]) {
14 int nprevmoves, nmoves, nscramble, coord = 0; 14 int nprevmoves, nmoves, nscramble, coord = 0;
15 15
@@ -31,7 +31,7 @@ int premoves_inverse(int moves[21], int scramble[], int prev_moves[21],
31/******/ 31/******/
32/* EO */ 32/* EO */
33/******/ 33/******/
34void niss_eo_dfs(int eo, int scramble[], int eo_list[][21], int *eo_count, 34void niss_eo_dfs(int eo, int scramble[], int eo_list[][30], int *eo_count,
35 int t_table[pow2to11][19], int p_table[pow2to11], 35 int t_table[pow2to11][19], int p_table[pow2to11],
36 int last1, int last2, int moves, int m, int d, int niss, 36 int last1, int last2, int moves, int m, int d, int niss,
37 int can_use_niss, int hide) { 37 int can_use_niss, int hide) {
@@ -80,7 +80,7 @@ void niss_eo_dfs(int eo, int scramble[], int eo_list[][21], int *eo_count,
80 } 80 }
81} 81}
82 82
83int eo_scram_spam(int scram[], int eo_list[][21], int fb, int rl, int ud, 83int eo_scram_spam(int scram[], int eo_list[][30], int fb, int rl, int ud,
84 int m, int b, int niss, int h) { 84 int m, int b, int niss, int h) {
85 85
86 init_small_pruning_tables(); 86 init_small_pruning_tables();
@@ -112,8 +112,8 @@ int eo_scram_spam(int scram[], int eo_list[][21], int fb, int rl, int ud,
112 112
113 113
114/* Scramble includes premoves for previous EO */ 114/* Scramble includes premoves for previous EO */
115void niss_dr_from_eo_dfs(int co, int epos, int scramble[], int eo_moves[21], 115void niss_dr_from_eo_dfs(int co, int epos, int scramble[], int eo_moves[30],
116 int dr_list[][21], int *dr_count, 116 int dr_list[][30], int *dr_count,
117 int co_t_table[pow3to7][19], 117 int co_t_table[pow3to7][19],
118 int epos_t_table[binom12on4][19], 118 int epos_t_table[binom12on4][19],
119 int8_t p_table[pow3to7][binom12on4], int mask, 119 int8_t p_table[pow3to7][binom12on4], int mask,
@@ -169,7 +169,7 @@ void niss_dr_from_eo_dfs(int co, int epos, int scramble[], int eo_moves[21],
169 moves, m, d, 1, can_use_niss, hide); 169 moves, m, d, 1, can_use_niss, hide);
170} 170}
171 171
172int drfrom_scram_spam(int scram[], int dr_list[][21], int from, int fb, 172int drfrom_scram_spam(int scram[], int dr_list[][30], int from, int fb,
173 int rl, int ud, int m, int b, int niss, int hide) { 173 int rl, int ud, int m, int b, int niss, int hide) {
174 174
175 init_drfromeo_pruning_tables(); 175 init_drfromeo_pruning_tables();
@@ -252,8 +252,8 @@ int drfrom_scram_spam(int scram[], int dr_list[][21], int from, int fb,
252/***************/ 252/***************/
253 253
254/* Scramble includes premoves for previous DR */ 254/* Scramble includes premoves for previous DR */
255void niss_htr_from_dr_dfs(int cp, int eo3, int scramble[], int eodr_moves[21], 255void niss_htr_from_dr_dfs(int cp, int eo3, int scramble[], int eodr_moves[30],
256 int htr_list[][21], int *htr_count, 256 int htr_list[][30], int *htr_count,
257 int eo3_t_table[pow2to11][19], 257 int eo3_t_table[pow2to11][19],
258 int cp_to_htr_pruning_table[factorial8], 258 int cp_to_htr_pruning_table[factorial8],
259 int cp_htr_pruning_table[factorial8], 259 int cp_htr_pruning_table[factorial8],
@@ -314,7 +314,7 @@ void niss_htr_from_dr_dfs(int cp, int eo3, int scramble[], int eodr_moves[21],
314 0, 0, moves, m, d, 1, can_use_niss, hide); 314 0, 0, moves, m, d, 1, can_use_niss, hide);
315} 315}
316 316
317int htr_scram_spam(int scram[], int htr_list[][21], int from, 317int htr_scram_spam(int scram[], int htr_list[][30], int from,
318 int m, int b, int niss, int hide) { 318 int m, int b, int niss, int hide) {
319 319
320 init_small_pruning_tables(); 320 init_small_pruning_tables();
@@ -370,7 +370,7 @@ int htr_scram_spam(int scram[], int htr_list[][21], int from,
370/* Direct DR (no NISS) */ 370/* Direct DR (no NISS) */
371/***********************/ 371/***********************/
372void dr_dfs(int eo, int eo2, int eslice, int co, 372void dr_dfs(int eo, int eo2, int eslice, int co,
373 int dr_list[][21], int *dr_count, 373 int dr_list[][30], int *dr_count,
374 int eo_t_table[pow2to11][19], int eo2_t_table[pow2to11][19], 374 int eo_t_table[pow2to11][19], int eo2_t_table[pow2to11][19],
375 int eslice_t_table[binom12on4][19], int co_t_table[pow3to7][19], 375 int eslice_t_table[binom12on4][19], int co_t_table[pow3to7][19],
376 int8_t eo_eslice_p_table[pow2to11][binom12on4], 376 int8_t eo_eslice_p_table[pow2to11][binom12on4],
@@ -411,7 +411,7 @@ void dr_dfs(int eo, int eo2, int eslice, int co,
411 } 411 }
412} 412}
413 413
414int dr_scram_spam(int scram[], int dr_list[][21], int fb, int rl, int ud, 414int dr_scram_spam(int scram[], int dr_list[][30], int fb, int rl, int ud,
415 int m, int b, int h) { 415 int m, int b, int h) {
416 416
417 init_directdr_pruning_tables(); 417 init_directdr_pruning_tables();
@@ -462,7 +462,7 @@ int dr_scram_spam(int scram[], int dr_list[][21], int fb, int rl, int ud,
462/*************/ 462/*************/
463/* DR finish */ 463/* DR finish */
464/*************/ 464/*************/
465void dr_finish_dfs(int cp, int ep8, int ep4, int sol[][21], int *sol_count, 465void dr_finish_dfs(int cp, int ep8, int ep4, int sol[][30], int *sol_count,
466 int ep8_t_table[factorial8][19], 466 int ep8_t_table[factorial8][19],
467 int ep4_t_table[factorial4][19], 467 int ep4_t_table[factorial4][19],
468 int cp_p_table[factorial8], 468 int cp_p_table[factorial8],
@@ -500,7 +500,7 @@ void dr_finish_dfs(int cp, int ep8, int ep4, int sol[][21], int *sol_count,
500 return; 500 return;
501} 501}
502 502
503int dr_finish_scram_spam(int scram[], int sol[][21], int from, int m, int b) { 503int dr_finish_scram_spam(int scram[], int sol[][30], int from, int m, int b) {
504 504
505 init_small_pruning_tables(); 505 init_small_pruning_tables();
506 506
@@ -551,7 +551,7 @@ int dr_finish_scram_spam(int scram[], int sol[][21], int from, int m, int b) {
551 return n; 551 return n;
552} 552}
553 553
554int htr_finish_scram_spam(int scram[], int sol[][21], int m, int b) { 554int htr_finish_scram_spam(int scram[], int sol[][30], int m, int b) {
555 555
556 init_small_pruning_tables(); 556 init_small_pruning_tables();
557 557
@@ -588,7 +588,7 @@ int htr_finish_scram_spam(int scram[], int sol[][21], int m, int b) {
588/**************/ 588/**************/
589/* DR corners */ 589/* DR corners */
590/**************/ 590/**************/
591void dr_corners_dfs(int cp, int sol[][21], int *sol_count, 591void dr_corners_dfs(int cp, int sol[][30], int *sol_count,
592 int cp_p_table[factorial8], int mask, int last1, int last2, 592 int cp_p_table[factorial8], int mask, int last1, int last2,
593 int moves, int m, int d, int ignore) { 593 int moves, int m, int d, int ignore) {
594 594
@@ -621,7 +621,7 @@ void dr_corners_dfs(int cp, int sol[][21], int *sol_count,
621 } 621 }
622} 622}
623 623
624int dr_corners_scram_spam(int scram[], int sol[][21], int from, int m, int b, 624int dr_corners_scram_spam(int scram[], int sol[][30], int from, int m, int b,
625 int ignore) { 625 int ignore) {
626 626
627 init_small_pruning_tables(); 627 init_small_pruning_tables();
@@ -666,7 +666,7 @@ int dr_corners_scram_spam(int scram[], int sol[][21], int from, int m, int b,
666/* Full solver */ 666/* Full solver */
667/***************/ 667/***************/
668 668
669int is_ep_solved(int ep, int moves[21]) { 669int is_ep_solved(int ep, int moves[30]) {
670 int ep_arr[12]; 670 int ep_arr[12];
671 ep_int_to_array(ep, ep_arr); 671 ep_int_to_array(ep, ep_arr);
672 for (int i = 0; moves[i]; i++) 672 for (int i = 0; moves[i]; i++)
@@ -677,7 +677,7 @@ int is_ep_solved(int ep, int moves[21]) {
677/* Solves directly using only small tables. Suitable for short solutions. */ 677/* Solves directly using only small tables. Suitable for short solutions. */
678void small_optimal_dfs(int eofb, int eorl, int eoud, int ep, 678void small_optimal_dfs(int eofb, int eorl, int eoud, int ep,
679 int coud, int cofb, int corl, int cp, 679 int coud, int cofb, int corl, int cp,
680 int sol[][21], int *sol_count, int last1, int last2, 680 int sol[][30], int *sol_count, int last1, int last2,
681 int moves, int m, int d) { 681 int moves, int m, int d) {
682 if (moves + eofb_pruning_table[eofb] > d || 682 if (moves + eofb_pruning_table[eofb] > d ||
683 moves + eorl_pruning_table[eorl] > d || 683 moves + eorl_pruning_table[eorl] > d ||
@@ -721,7 +721,7 @@ void small_optimal_dfs(int eofb, int eorl, int eoud, int ep,
721void medium_optimal_dfs(int eofb, int eorl, int eoud, 721void medium_optimal_dfs(int eofb, int eorl, int eoud,
722 int epose, int eposs, int eposm, int ep, 722 int epose, int eposs, int eposm, int ep,
723 int coud, int cofb, int corl, int cp, 723 int coud, int cofb, int corl, int cp,
724 int sol[][21], int *sol_count, int last1, int last2, 724 int sol[][30], int *sol_count, int last1, int last2,
725 int moves, int m, int d) { 725 int moves, int m, int d) {
726 if (moves + eofb_epose_pruning_table[eofb][epose] > d || 726 if (moves + eofb_epose_pruning_table[eofb][epose] > d ||
727 moves + eorl_eposs_pruning_table[eorl][eposs] > d || 727 moves + eorl_eposs_pruning_table[eorl][eposs] > d ||
@@ -769,7 +769,7 @@ void medium_optimal_dfs(int eofb, int eorl, int eoud,
769 769
770/* Uses huge tables */ 770/* Uses huge tables */
771int optimal_dfs(int ep, int cp, int eo, int co, int emslices, 771int optimal_dfs(int ep, int cp, int eo, int co, int emslices,
772 int sol[][21], int last1, int last2, int moves, int d) { 772 int sol[][30], int last1, int last2, int moves, int d) {
773 if (moves + cp_co_pruning_table[cp][co] > d || 773 if (moves + cp_co_pruning_table[cp][co] > d ||
774 moves + triple_eo_pruning_table[eo][emslices] > d) 774 moves + triple_eo_pruning_table[eo][emslices] > d)
775 return 0; 775 return 0;
@@ -795,7 +795,7 @@ int optimal_dfs(int ep, int cp, int eo, int co, int emslices,
795 return 0; 795 return 0;
796} 796}
797 797
798int solve_scram(int scram[], int sol[][21], int m, int b, int optimal) { 798int solve_scram(int scram[], int sol[][30], int m, int b, int optimal) {
799 799
800 /* Initialize pieces. */ 800 /* Initialize pieces. */
801 int eofb = 0, eorl = 0, eoud = 0, ep = 0; 801 int eofb = 0, eorl = 0, eoud = 0, ep = 0;
@@ -850,10 +850,10 @@ int solve_scram(int scram[], int sol[][21], int m, int b, int optimal) {
850 return n; 850 return n;
851 851
852 /* Then we try a 2-step solver */ 852 /* Then we try a 2-step solver */
853 int max_step1 = 5000; 853 int max_step1 = 100;
854 int db = 14; 854 int db = 12;
855 int step1[max_step1+10][21]; 855 int step1[max_step1+10][30];
856 int ss[300], step2[2][21]; 856 int ss[300], step2[2][30];
857 int best = b+1; 857 int best = b+1;
858 858
859 /* TODO maybe: for now, multiple solutions can be found only using the 859 /* TODO maybe: for now, multiple solutions can be found only using the
diff --git a/src/solver.h b/src/solver.h
index 7724e52..14997ed 100644
--- a/src/solver.h
+++ b/src/solver.h
@@ -1,13 +1,13 @@
1int eo_scram_spam(int scram[], int eo_list[][21], int fb, int rl, int ud, 1int eo_scram_spam(int scram[], int eo_list[][30], int fb, int rl, int ud,
2 int m, int b, int niss, int h); 2 int m, int b, int niss, int h);
3int dr_scram_spam(int scram[], int dr_list[][21], int fb, int rl, int ud, 3int dr_scram_spam(int scram[], int dr_list[][30], int fb, int rl, int ud,
4 int m, int b, int h); 4 int m, int b, int h);
5int drfrom_scram_spam(int scram[], int dr_list[][21], int from, int fb, 5int drfrom_scram_spam(int scram[], int dr_list[][30], int from, int fb,
6 int rl, int ud, int m, int b, int niss, int hide); 6 int rl, int ud, int m, int b, int niss, int hide);
7int htr_scram_spam(int scram[], int htr_list[][21], int from, 7int htr_scram_spam(int scram[], int htr_list[][30], int from,
8 int m, int b, int niss, int hide); 8 int m, int b, int niss, int hide);
9int dr_corners_scram_spam(int scram[], int sol[][21], int from, int m, int b, 9int dr_corners_scram_spam(int scram[], int sol[][30], int from, int m, int b,
10 int ignore); 10 int ignore);
11int dr_finish_scram_spam(int scram[], int sol[][21], int from, int m, int b); 11int dr_finish_scram_spam(int scram[], int sol[][30], int from, int m, int b);
12int htr_finish_scram_spam(int scram[], int sol[][21], int m, int b); 12int htr_finish_scram_spam(int scram[], int sol[][30], int m, int b);
13int solve_scram(int scram[], int sol[][21], int m, int b, int optimal); 13int solve_scram(int scram[], int sol[][30], int m, int b, int optimal);

Generated with cgit - Back to sebastiano.tronto.net