# HG changeset patch # User viric@llimona # Date 1147008519 -7200 # Node ID fe078fb2e8b43afbe1591fc0e189a0989e6bea03 # Parent 866013971139c7ba7624d8be4c9869664a242b76 Now I think the code works. There were some indexing mistakse, return instead of continue, etc. diff -r 866013971139 -r fe078fb2e8b4 algorithm.c --- a/algorithm.c Sun May 07 13:32:52 2006 +0200 +++ b/algorithm.c Sun May 07 15:28:39 2006 +0200 @@ -234,18 +234,18 @@ if (is_new_map(maps, depth+1)) { - actual_map = &maps[depth+1]; -#ifdef DEBUG /* to be out */ - show_percent_and_map(); -#endif fill_deps(m); if (are_there_fixed_boxes(m, new_movements, &num_new_movements)) { /* That means that the map is illegal */ /* Maybe we could update the percent here... */ - return FALSE; + continue; } + actual_map = &maps[depth+1]; +#ifdef DEBUG /* to be out */ + show_percent_and_map(); +#endif /* the assert should be IN the function before, before OVERfilling new_movements */ assert(num_new_movements < MAX_MOVES); @@ -370,6 +370,7 @@ /* Initialize to 0 the dependency structures */ memset((void *) &dep, 0, sizeof(dep)); + new_free.n=0; for(i=0; iNumBoxes; i++) { new_free.box[i] = FALSE; @@ -400,9 +401,12 @@ { if(m->box_deps[i].dep_dir[d] > 0) { - dep.box[i][m->box_deps[i].dep_dir[d]] = - TRUE; - dep.ndeps[i]++; + if (!dep.box[i][m->box_deps[i].dep_dir[d]]) + { + dep.box[i][m->box_deps[i].dep_dir[d]] = + TRUE; + dep.ndeps[i]++; + } } else if(m->box_deps[i].dep_dir[d] == FREE) { @@ -430,12 +434,13 @@ /* For each direction, try if the box can be moved */ for(d=0; d<4; d++) { - if(m->box_deps[i].dep_dir[d] == FREE) + if(m->box_deps[new_free.box[i]].dep_dir[d] == FREE) { - add_position3(tpos, m->Box[i], move_vectors[OPPOSITE_DIR(d)]) + add_position3(tpos, m->Box[new_free.box[i]], move_vectors[OPPOSITE_DIR(d)]) if (m->man_moves[tpos.y][tpos.x] == MANCANMOVE) { - movements[*num_movements].box = i; + movements[*num_movements].box = + new_free.box[i]; movements[*num_movements].dir = move_vectors[d]; (*num_movements)++; @@ -485,7 +490,7 @@ dep.ndeps[j]--; assert(dep.ndeps[j] >= 0); if (dep.ndeps[j] == 0 && - !free.box_is_free[i]) + !free.box_is_free[tfree.box[i]]) { new_free.box[new_free.n++]=j; free.box[free.n++]=j; @@ -581,7 +586,8 @@ box, we set it up too. */ /* *** MAYBE IT'S BETTER NOT TO SET IT */ - if(m->box_deps[i].dep_dir[dir] == FREE) + if(m->box_deps[i].dep_dir[OPPOSITE_DIR(dir)] + == FREE) { m->box_deps[i].dep_dir[OPPOSITE_DIR(dir)] = m->cells_boxes[n.y][n.x]; @@ -607,7 +613,6 @@ fill_deps(&maps[0]); /* Initializing actual_map here AT LEAST gives protection against SIGSEGV */ - actual_map = &maps[0]; assert(!are_there_fixed_boxes(&maps[0], new_movements, &num_new_movements)); search_did_found(maps, 0, new_movements, num_new_movements, 100, 0);