traffic

Zkoušení tahů a prohledávání stavového prostoru do šířky. Jediným problémem je zakódování stavu do číselné podoby, abychom si mohli pamatovat, které už byly navštíveny.

Jedním ze způsobů je využití omezeného počtu autíček. Každé auto může mít pouze 5 různých pozic. Maximální počet pozic je 5^10 = 9765625, tj. stačí nám 10MB.



/*
  STATE SPACE
*/
nrmoves_t best [MAXSTATES];
int qs [MAXOPENS], qb, qe;
int solution;


void enqueue (state_t* st, int dist)
{
	int i;
	i = state_encode (st);
	if ( best[i] <= dist )  return;
	best[i] = dist;
	qs[qe++ % MAXOPENS] = i;
	for ( i = 0;  i < SIZE;  ++i )
		if ( (*st)[i][SIZE-1] == 'x' && solution > dist )
			solution = dist;
}


void expand_row (state_t* st, int dist, char** chp)
{
	char ch;
	int i, j, k, x;
	for ( i = 1;  i <= SIZE-2;  ++i )
		if ( *chp[i] == CH_EMPTY )
		{
			for ( j = i;  *chp[j] == CH_EMPTY && j <= SIZE-1;  ++j ) {}
			for ( k = j;  *chp[k] == *chp[j] && k <= SIZE;  ++k ) {}
			if ( k-j > 1 )
			{
				/* move car [j..k-1] to [i] */
				ch = *chp[j];
				for ( x = 0;  x < k-j;  ++x )  *chp[j+x] = CH_EMPTY;
				for ( x = 0;  x < k-j;  ++x )  *chp[i+x] = ch;
				enqueue (st, dist);
				for ( x = 0;  x < k-j;  ++x )  *chp[i+x] = CH_EMPTY;
				for ( x = 0;  x < k-j;  ++x )  *chp[j+x] = ch;
			}
		}
	for ( i = SIZE;  i >= 3;  --i )
		if ( *chp[i] == CH_EMPTY )
		{
			for ( j = i;  *chp[j] == CH_EMPTY && j >= 2;  --j ) {}
			for ( k = j;  *chp[k] == *chp[j] && k >= 1;  --k ) {}
			if ( j-k > 1 )
			{
				/* move car [k+1..j] to [..i] */
				ch = *chp[j];
				for ( x = 0;  x < j-k;  ++x )  *chp[j-x] = CH_EMPTY;
				for ( x = 0;  x < j-k;  ++x )  *chp[i-x] = ch;
				enqueue (st, dist);
				for ( x = 0;  x < j-k;  ++x )  *chp[i-x] = CH_EMPTY;
				for ( x = 0;  x < j-k;  ++x )  *chp[j-x] = ch;
			}
		}
}