sokosol.c
author viric@llimona
Fri, 05 May 2006 23:43:20 +0200
changeset 4 d9259a605dec
parent 3 29cc57a9678e
child 6 bfbca2c0fc70
permissions -rw-r--r--
A cleaner version, split between different files.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     2
#include <string.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     3
#include <assert.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     4
#include <stdlib.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     5
#include <unistd.h>
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     6
#include <signal.h>
4
d9259a605dec A cleaner version, split between different files.
viric@llimona
parents: 3
diff changeset
     7
#include "general.h"
0
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     8
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
     9
#define NBOX(n) ((n)<<2)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    10
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    11
/* SOKOBAN Solution Finder
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    12
 *
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    13
 * Input File Format: XSB
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    14
 *
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    15
 * XSB Format definition:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    16
 * 	Character matrix of:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    17
 * 		@	MAN
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    18
 * 		#	WALL
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    19
 * 		$	BOX
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    20
 * 		*	BOX over PLATFORM
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    21
 * 		+	PLATFORM
4
d9259a605dec A cleaner version, split between different files.
viric@llimona
parents: 3
diff changeset
    22
 * 		-	CORNER (optional) Where a BOX should not be put
0
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    23
 * 	Everything that cannot be reached by the man or boxes (WALLS) must be
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    24
 * 	marked as is: WALLS.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    25
 * 	All lines must be of the same length.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    26
 */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    27
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    28
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    29
float percent_to_show = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    30
int depth_to_show = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    31
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    32
int max_depth = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    33
int min_depth_period = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    34
int max_depth_period = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    35
struct Map * actual_map;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    36
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    37
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    38
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    39
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    40
int InverseMove(char Dir1, char Dir2)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    41
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    42
	if ((Dir1 + Dir2 == DIR_LEFT + DIR_RIGHT) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    43
		(Dir1 + Dir2 == DIR_UP + DIR_DOWN))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    44
		return 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    45
	return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    46
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    47
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    48
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    49
void PrintCombination(int Moves[], int NumMoves)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    50
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    51
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    52
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    53
	for (i=0; i < NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    54
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    55
		printf("%i", Moves[i] >> 2);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    56
		if ((Moves[i] & 0x03) == DIR_LEFT)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    57
			printf("L");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    58
		else if ((Moves[i] & 0x03) == DIR_RIGHT)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    59
			printf("R");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    60
		else if ((Moves[i] & 0x03) == DIR_UP)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    61
			printf("U");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    62
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    63
			printf("D");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    64
		printf(",");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    65
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    66
	printf("\n");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    67
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    68
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    69
#if 0 /*** THIS IS AN ERROR!!!  The box_will_be_blocked function doesn't work!*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    70
 Situation:
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    71
    
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    72
  ->@$ #
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    73
      $
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    74
*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    75
int box_will_be_blocked(const struct Map * m, const struct Position mov,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    76
	const struct Position box_pos)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    77
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    78
	struct Position next_pos2, tmp, tmp2[2];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    79
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    80
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    81
	next_pos2.x = box_pos.x + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    82
	next_pos2.y = box_pos.y + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    83
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    84
	tmp.x = next_pos2.x + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    85
	tmp.y = next_pos2.y + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    86
	tmp2[0].x = next_pos2.x + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    87
	tmp2[0].y = next_pos2.y + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    88
	tmp2[1].x = next_pos2.x - mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    89
	tmp2[1].y = next_pos2.y - mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    90
	for (i=0; i < 2; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    91
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    92
		if (m->man_moves[tmp.y][tmp.x] == WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    93
			m->man_moves[tmp2[i].y][tmp2[i].x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    94
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    95
			return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    96
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    97
		else if (m->man_moves[tmp.y][tmp.x] == BOX &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    98
			m->man_moves[tmp2[i].y][tmp2[i].x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
    99
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   100
			return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   101
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   102
		else if (m->man_moves[tmp.y][tmp.x] == BOX &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   103
			m->man_moves[tmp2[i].y][tmp2[i].x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   104
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   105
			return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   106
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   107
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   108
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   109
	return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   110
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   111
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   112
int is_corner_area(const struct Map * m, const struct Position p,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   113
	const struct Position box, const struct Position new_box)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   114
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   115
	int NumMoves, NewMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   116
	struct Position pos[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   117
	struct Position new_pos[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   118
	char corners[MAX_Y][MAX_X];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   119
	int i,j;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   120
	struct Position next_pos;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   121
	char *next_cell;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   122
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   123
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   124
	/* Blank the garden */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   125
	for (j = 0; j<m->SizeY; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   126
		for (i=0; i<m->SizeX; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   127
			corners[j][i] = m->Cells[j][i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   128
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   129
	/* Let's put the boxes */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   130
	for (i = 0; i<m->NumBoxes; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   131
		corners[m->Box[i].y][m->Box[i].x] = BOX;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   132
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   133
	/* Let's put our box - it can be simply added */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   134
	corners[new_box.y][new_box.x] = BOX;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   135
	/* Let's remove the original box. */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   136
	corners[box.y][box.x] = BLANK;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   137
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   138
	NewMoves = 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   139
	new_pos[0] = p;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   140
	while (NewMoves > 0)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   141
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   142
		/* The before named "New Moves" become the moves we have
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   143
		   to analyze */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   144
		NumMoves = NewMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   145
		for (i=0; i<NewMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   146
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   147
			pos[i] = new_pos[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   148
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   149
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   150
		/* Search new positions for each position */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   151
		NewMoves = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   152
		for (i=0; i<NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   153
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   154
			/* For each direction */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   155
			for (j=0; j<4; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   156
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   157
				next_pos.x = pos[i].x + move_vectors[j].x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   158
				next_pos.y = pos[i].y + move_vectors[j].y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   159
				next_cell = &corners[next_pos.y][next_pos.x];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   160
				if(*next_cell == BLANK ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   161
					*next_cell == PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   162
				{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   163
					return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   164
				}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   165
				else if(*next_cell == CORNER)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   166
				{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   167
					new_pos[NewMoves] = next_pos;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   168
					*next_cell = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   169
					NewMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   170
				}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   171
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   172
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   173
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   174
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   175
	return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   176
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   177
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   178
int does_box_close_corners(const struct Map * m, const struct Position mov,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   179
	const struct Position box_pos)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   180
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   181
	struct Position p, p2;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   182
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   183
	p.x = box_pos.x + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   184
	p.y = box_pos.y + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   185
	
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   186
	/* Let's plan the checks */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   187
	/* The point will be marked with a MANCANMOVE */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   188
	p2.x = p.x + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   189
	p2.y = p.y + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   190
	if (m->Cells[p2.y][p2.x] == CORNER)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   191
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   192
		if (is_corner_area(m, p2, box_pos, p))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   193
			return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   194
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   195
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   196
	p2.x = p.x + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   197
	p2.y = p.y + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   198
	if (m->Cells[p2.y][p2.x] == CORNER)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   199
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   200
		if (is_corner_area(m, p2, box_pos, p))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   201
			return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   202
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   203
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   204
	p2.x = p.x - mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   205
	p2.y = p.y - mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   206
	if (m->Cells[p2.y][p2.x] == CORNER)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   207
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   208
		if (is_corner_area(m, p2, box_pos, p))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   209
			return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   210
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   211
	return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   212
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   213
#endif
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   214
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   215
/*
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   216
Catch the situation where a box is moved next to a corner, where the box
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   217
next to it will not be able to be moved.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   218
*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   219
int is_dead1(const struct Map * m, const struct Position mov,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   220
	const struct Position new_pos)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   221
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   222
	struct Position opposite1, opposite2;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   223
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   224
	/* The wall corners must exist */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   225
	opposite1.x = -mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   226
	opposite1.y = -mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   227
	opposite2.x = mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   228
	opposite2.y = mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   229
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   230
#ifdef DEBUG
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   231
	ShowMap(m);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   232
#endif
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   233
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   234
	/* Test the first corner */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   235
	if (m->Cells[new_pos.y+mov.y+opposite1.y][new_pos.x+mov.x+opposite1.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   236
		== WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   237
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   238
		/* Test wall at opposites 1*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   239
		if (m->Cells[new_pos.y+opposite1.y][new_pos.x+opposite1.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   240
			== WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   241
			m->man_moves[new_pos.y+mov.y][new_pos.x+mov.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   242
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   243
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   244
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   245
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   246
		if (m->man_moves[new_pos.y+opposite1.y][new_pos.x+opposite1.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   247
			== BOX &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   248
			m->Cells[new_pos.y+mov.y][new_pos.x+mov.x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   249
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   250
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   251
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   252
		/* Test wall at opposites 2 */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   253
		if (m->Cells[new_pos.y+opposite2.y][new_pos.x+opposite2.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   254
			== WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   255
			m->man_moves[new_pos.y+mov.y][new_pos.x+mov.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   256
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   257
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   258
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   259
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   260
		if (m->man_moves[new_pos.y+opposite2.y][new_pos.x+opposite2.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   261
			== BOX &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   262
			m->Cells[new_pos.y+mov.y][new_pos.x+mov.x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   263
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   264
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   265
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   266
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   267
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   268
	/* Test the second corner */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   269
	if (m->Cells[new_pos.y+mov.y+opposite2.y][new_pos.x+mov.x+opposite2.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   270
		== WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   271
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   272
		/* Test wall at opposites 1*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   273
		if (m->Cells[new_pos.y+opposite1.y][new_pos.x+opposite1.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   274
			== WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   275
			m->man_moves[new_pos.y+mov.y][new_pos.x+mov.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   276
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   277
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   278
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   279
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   280
		if (m->man_moves[new_pos.y+opposite1.y][new_pos.x+opposite1.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   281
			== BOX &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   282
			m->Cells[new_pos.y+mov.y][new_pos.x+mov.x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   283
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   284
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   285
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   286
		/* Test wall at opposites 2 */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   287
		if (m->Cells[new_pos.y+opposite2.y][new_pos.x+opposite2.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   288
			== WALL &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   289
			m->man_moves[new_pos.y+mov.y][new_pos.x+mov.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   290
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   291
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   292
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   293
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   294
		if (m->man_moves[new_pos.y+opposite2.y][new_pos.x+opposite2.x]
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   295
			== BOX &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   296
			m->Cells[new_pos.y+mov.y][new_pos.x+mov.x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   297
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   298
				return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   299
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   300
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   301
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   302
	return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   303
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   304
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   305
/*
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   306
Catch the situation where a corner gets surrounded by boxes.
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   307
*/
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   308
int is_dead2(const struct Map * m, const struct Position mov,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   309
	const struct Position new_pos)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   310
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   311
	struct Position next, next2, opposite1, opposite2;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   312
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   313
	next.x = new_pos.x+mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   314
	next.y = new_pos.y+mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   315
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   316
	/* The corner must exist */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   317
	if (m->Cells[next.y][next.x] != CORNER)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   318
		return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   319
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   320
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   321
	/* The wall corners must exist */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   322
	opposite1.x = next.x -mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   323
	opposite1.y = next.y -mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   324
	opposite2.x = next.x + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   325
	opposite2.y = next.y + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   326
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   327
	if (m->man_moves[opposite1.y][opposite1.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   328
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   329
		if(m->Cells[opposite1.y+mov.y][opposite1.x+mov.x] == WALL
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   330
		   && m->Cells[opposite1.y-mov.y][opposite1.x-mov.x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   331
		   return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   332
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   333
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   334
	if (m->man_moves[opposite2.y][opposite2.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   335
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   336
		if(m->Cells[opposite2.y+mov.y][opposite2.x+mov.x] == WALL
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   337
		   && m->Cells[opposite2.y-mov.y][opposite2.x-mov.x] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   338
		   return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   339
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   340
	return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   341
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   342
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   343
int is_box_movable(const struct Map * m, const struct Position mov,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   344
	const struct Position box_pos)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   345
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   346
	struct Position next_pos2;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   347
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   348
	next_pos2.x = box_pos.x + mov.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   349
	next_pos2.y = box_pos.y + mov.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   350
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   351
	if((m->Cells[next_pos2.y][next_pos2.x] != BLANK &&
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   352
		m->Cells[next_pos2.y][next_pos2.x] != PLATFORM) ||
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   353
		m->man_moves[next_pos2.y][next_pos2.x] == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   354
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   355
		return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   356
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   357
	else if (is_dead1(m, mov, next_pos2) == TRUE)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   358
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   359
		return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   360
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   361
	else if (is_dead2(m, mov, next_pos2) == TRUE)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   362
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   363
		return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   364
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   365
	return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   366
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   367
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   368
/* It modifies m->man_moves */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   369
int get_box_movements(struct Map * m,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   370
	struct BoxMove movements[])
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   371
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   372
	struct Position pos[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   373
	struct Position new_pos[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   374
	int NumMoves, NewMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   375
	int j, i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   376
	struct Position next_pos;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   377
	char *next_cell;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   378
	int num_box_movements = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   379
	
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   380
	/* Let's  the map with only walls in man_moves - other, blanks */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   381
	for (j = 0; j<m->SizeY; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   382
		for (i=0; i<m->SizeX; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   383
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   384
			if (m->Cells[j][i] == WALL)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   385
				m->man_moves[j][i] = WALL;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   386
			else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   387
				m->man_moves[j][i] = BLANK;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   388
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   389
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   390
	/* Let's put the boxes */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   391
	for (i = 0; i<m->NumBoxes; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   392
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   393
		m->man_moves[m->Box[i].y][m->Box[i].x] = BOX;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   394
		m->cells_boxes[m->Box[i].y][m->Box[i].x] = i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   395
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   396
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   397
	NewMoves = 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   398
	new_pos[0].x = m->Man.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   399
	new_pos[0].y = m->Man.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   400
	m->man_moves[m->Man.y][m->Man.x] = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   401
	while (NewMoves > 0)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   402
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   403
		/* The before named "New Moves" become the moves we have
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   404
		   to analyze */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   405
		NumMoves = NewMoves;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   406
		for (i=0; i<NewMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   407
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   408
			pos[i] = new_pos[i];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   409
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   410
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   411
		/* Search new positions for each position */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   412
		NewMoves = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   413
		for (i=0; i<NumMoves; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   414
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   415
			/* For each direction */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   416
			for (j=0; j<4; j++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   417
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   418
				next_pos.x = pos[i].x + move_vectors[j].x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   419
				next_pos.y = pos[i].y + move_vectors[j].y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   420
				next_cell = &m->man_moves[next_pos.y][next_pos.x];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   421
				if(*next_cell == BLANK)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   422
				{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   423
					new_pos[NewMoves] = next_pos;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   424
					*next_cell = MANCANMOVE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   425
					NewMoves++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   426
				}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   427
				else if (*next_cell == BOX)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   428
				{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   429
						
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   430
					/* Check if the box is movable */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   431
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   432
					if (is_box_movable(m, move_vectors[j],
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   433
						next_pos ))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   434
					{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   435
						{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   436
					movements[num_box_movements].box =
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   437
					m->cells_boxes[next_pos.y][next_pos.x];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   438
					movements[num_box_movements].dir =
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   439
					move_vectors[j];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   440
					num_box_movements++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   441
						}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   442
					}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   443
					
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   444
				}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   445
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   446
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   447
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   448
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   449
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   450
	return num_box_movements;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   451
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   452
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   453
void force_move_box(struct Map *m, struct BoxMove move)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   454
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   455
	struct Position newpos;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   456
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   457
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   458
	/* Add coords */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   459
	newpos.x = m->Box[move.box].x + move.dir.x;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   460
	newpos.y = m->Box[move.box].y + move.dir.y;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   461
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   462
	/* Be certain the move can be done */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   463
	assert(m->Cells[newpos.y][newpos.x] != BOX);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   464
	assert(m->Cells[newpos.y][newpos.x] != WALL);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   465
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   466
	/* Control if we moved the box to a platform */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   467
	if(m->Cells[newpos.y][newpos.x] == PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   468
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   469
		m->NumBoxesInPlatform++;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   470
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   471
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   472
	/* Control if we moved the box from a platform */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   473
	if (m->Cells[m->Box[move.box].y][m->Box[move.box].x] == PLATFORM)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   474
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   475
		m->NumBoxesInPlatform--;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   476
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   477
	m->Man = m->Box[move.box];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   478
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   479
	m->Box[move.box] = newpos;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   480
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   481
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   482
int are_boxes_equal(const struct Position b1[], const struct Position b2[],
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   483
	int n)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   484
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   485
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   486
	char tmp[MAX_Y][MAX_X]; /* !!!argh */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   487
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   488
	memset(tmp, 0, sizeof(tmp));
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   489
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   490
	for (i=0; i < n; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   491
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   492
		tmp[b1[i].y][b1[i].x] = 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   493
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   494
	for (i=0; i < n; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   495
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   496
		if (tmp[b2[i].y][b2[i].x] != 1)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   497
			return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   498
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   499
	return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   500
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   501
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   502
int is_new_map(struct Map maps[], int depth)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   503
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   504
	struct Map *m;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   505
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   506
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   507
	m = &maps[depth];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   508
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   509
	for(i=0; i<max_depth; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   510
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   511
		/* No l'hem de comparar amb ell mateix */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   512
		if (i == depth)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   513
			continue;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   514
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   515
		if (m->NumBoxesInPlatform != maps[i].NumBoxesInPlatform)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   516
			continue;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   517
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   518
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   519
			if (!are_boxes_equal(m->Box, maps[i].Box, m->NumBoxes))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   520
				continue;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   521
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   522
		return FALSE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   523
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   524
	return TRUE;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   525
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   526
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   527
void PrintMove(struct BoxMove b)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   528
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   529
	printf("Box: %i, Direction: {%i,%i}\n", b.box, b.dir.x, b.dir.y);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   530
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   531
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   532
void show_percent_callback(int parameter)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   533
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   534
	fprintf(stderr, "Percent: %2.12f, depth: %i-%i\n", percent_to_show,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   535
		min_depth_period, max_depth_period);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   536
	ShowMap(actual_map);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   537
	fflush(stderr);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   538
	min_depth_period = MAX_STEPS;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   539
	max_depth_period = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   540
#ifndef DEBUG
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   541
	alarm(ALARM_SECONDS);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   542
#endif
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   543
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   544
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   545
int search_depth(struct Map maps[], int depth,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   546
	struct BoxMove movements[],
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   547
	int num_movements, float percent, float total_percent)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   548
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   549
	struct BoxMove new_movements[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   550
	int num_new_movements;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   551
	struct Map *m; 
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   552
	int i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   553
	float next_percent;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   554
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   555
	next_percent = percent / num_movements;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   556
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   557
	m = &maps[depth+1];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   558
	if (depth > max_depth)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   559
		max_depth = depth;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   560
	if (depth > max_depth_period)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   561
		max_depth_period = depth;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   562
	if (depth < min_depth_period)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   563
		min_depth_period = depth;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   564
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   565
	for (i=0; i < num_movements; i++)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   566
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   567
		CopyMap(m, &maps[depth]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   568
		force_move_box(m, movements[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   569
		if (m->NumPlatforms == m->NumBoxesInPlatform)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   570
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   571
			printf("\nSolved!\n");
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   572
			PrintMove(movements[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   573
			return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   574
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   575
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   576
		if (is_new_map(maps, depth+1))
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   577
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   578
			num_new_movements = get_box_movements(m, new_movements);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   579
			assert(num_new_movements < MAX_MOVES);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   580
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   581
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   582
			num_new_movements = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   583
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   584
		if (num_new_movements == 0)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   585
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   586
			percent_to_show = total_percent + next_percent*i;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   587
			depth_to_show = depth;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   588
			actual_map = &maps[depth];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   589
#ifdef DEBUG		/* to be out */
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   590
			show_percent_callback(0);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   591
#endif
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   592
	
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   593
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   594
		else
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   595
		{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   596
			if (depth+1 < MAX_STEPS)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   597
			{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   598
				if(search_depth(maps, depth+1, new_movements,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   599
					num_new_movements, next_percent,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   600
					total_percent + next_percent*i) == 0)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   601
				{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   602
					PrintMove(movements[i]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   603
					return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   604
				}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   605
			}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   606
		}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   607
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   608
	return 1;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   609
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   610
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   611
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   612
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   613
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   614
void program_alarm()
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   615
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   616
        struct sigaction my_action;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   617
        int result;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   618
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   619
        my_action.sa_handler = show_percent_callback;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   620
        my_action.sa_flags = 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   621
        memset(&my_action.sa_mask, 0, sizeof(my_action.sa_mask));
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   622
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   623
        result = sigaction(SIGALRM, &my_action, NULL);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   624
        assert(result == 0);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   625
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   626
	alarm(1);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   627
}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   628
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   629
int main(int argn, char **argv)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   630
{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   631
	struct Map Morigin;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   632
	struct Map maps[MAX_STEPS+1];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   633
	struct BoxMove new_movements[MAX_MOVES];
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   634
	int num_new_movements;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   635
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   636
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   637
	if (argn != 2)
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   638
	{
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   639
		printf("Usage: %s <mapfile>\n", argv[0]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   640
		exit(3);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   641
	}
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   642
	ReadMap(&Morigin, argv[1]);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   643
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   644
	// Reget the original map
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   645
	CopyMap(&maps[0], &Morigin);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   646
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   647
	assert(maps[0].NumPlatforms > maps[0].NumBoxesInPlatform);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   648
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   649
	num_new_movements = get_box_movements(&maps[0], new_movements);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   650
	assert(num_new_movements < MAX_MOVES);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   651
	assert(num_new_movements > 0);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   652
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   653
#ifndef DEBUG
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   654
	program_alarm();
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   655
#endif
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   656
	search_depth(maps, 0, new_movements,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   657
		num_new_movements, 100. / num_new_movements,
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   658
		0);
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   659
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   660
	return 0;
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   661
be33ecaa3619 Initial commit.
viric@llimona
parents:
diff changeset
   662
}