All pastes #980054 Raw Edit

Untitled

public cpp v1 · immutable
·published 2008-04-10 19:38 UTC
rendered paste body
// Modified output and added Timer() code#include <ctime>#include <iostream>#include <string>#include <cstdlib>#define DISPLAY_RESULTS 0#define CX 5#define CY 5#define N 5long time1;typedef struct {			int x [10];			int y [10];			int sx, sy;			int y0;		}			PAT;typedef struct	{			PAT pats [8];			int n;			char c;			int used;		}			FIG;#define SX 10#define SY 6char field [SY+2][SX+2] = {0};char testfield [SY+2][SX+2];FIG figs [20];int nfigs;char figdef [] =	"I*****;"	"L****/*;"	"Y****/.*;"	"V***/*/*;"	"P***/**;"	"U***/*.*;"	"T***/.*/.*;"	"N***/..**;"	"Z**/.*/.**;"	"R**/.**/.*;"	"W**/.**/..*;"	"X.*/***/.*;";//char rules [8][4] = {char rules [8][5] = {	"+X+Y",	"-Y+X",	"-X-Y",	"+Y-X",	"-X+Y",	"-Y-X",	"+X-Y",	"+Y+X"	};int	equpat (PAT * p, PAT * q){	int i, j;	for (i = 0; i < N; i++)	{		for (j = 0; j < N; j++)			if (p->x[i] == q->x[j] && p->y[i] == q->y[j])				break;		if (j == N)			return 0;		}	return 1;}void	normalize_pat (PAT * p){	int xmin, xmax, ymin, ymax, i;	xmin = CX;	ymin = CY;	xmax = ymax = -1;	for (i = 0; i < N; i++)	{		if (p->x[i] < xmin) xmin = p->x[i];		if (p->x[i] > xmax) xmax = p->x[i];		if (p->y[i] < ymin) ymin = p->y[i];		if (p->y[i] > ymax) ymax = p->y[i];	}	p -> sx = xmax - xmin + 1;	p -> sy = ymax - ymin + 1;	p->y0 = CY;	for (i = 0; i < N; i++)	{		p->x[i] -= xmin;		p->y[i] -= ymin;		if (p->x[i] == 0 && p->y[i] < p->y0) p->y0 = p->y[i];	}}void	makeimages (FIG * f){	int i, j, k, x, y, X, Y;	normalize_pat (&f->pats [0]);	j = 1;	for (i = 1; i < 8; i++)	{		f->pats [j].sx = CX;		f->pats [j].sy = CY;		for (k = 0; k < N; k++)	{			x = f->pats[0].x[k];			y = f->pats[0].y[k];			X = rules [i][1] == 'X' ? x : y;			Y = rules [i][3] == 'X' ? x : y;			if (rules [i][0] == '-') X = CX - X - 1;			if (rules [i][2] == '-') Y = CY - Y - 1;			f->pats [j].x[k] = X;			f->pats [j].y[k] = Y;		}		normalize_pat (&f->pats [j]);		for (k = 0; k < j; k++)			if (equpat (&f->pats [k], &f->pats [j]))				break;		if (k == j) ++ j;	}	f->n = j;}char * readpat (PAT * p, char * s){	int x, y, mx, n;	x = y = mx = 0;	n = 0;	while (*s && *s != ';')	{		if (*s == '/')	{			++ y;			if (x > mx) mx = x;			x = 0;		} else	{			if (*s == '*')	{				p->x[n] = x;				p->y[n] = y;				++n;			}			++x;		}		++ s;	}	if (x > mx) mx = x;	p->sx = mx;	p->sy = y+1;	if (*s) ++ s;	if (n != N)		exit (1);	return s;}char * 	makefig (FIG * f, char * s){	f->c = *s++;	s = readpat (&f->pats [0], s);	makeimages (f);	return s;}void makefigs (void){	int	i;	char * s = figdef;	for (i = 0; i < sizeof (figs)/sizeof (FIG) && *s; i++)		s = makefig (&figs [i], s);	nfigs = i;}/* --------------------------------------------------- */int	nsols = 0;#if DISPLAY_RESULTSvoid	disp (void){	int y, x;	++nsols;	printf ("============== Solution #%d: =============== \n", nsols);	for (y = 1; y <= SY; y++)	{		for (x = 1; x <= SX; x++)			putchar (field [y][x] ? field [y][x] : '.');		printf ("\n");	}	printf ("\n");}#elsevoid	disp (void){	++nsols;}#endifvoid	put_fig (PAT * p, int x, int y, char c){	int i;	for (i = 0; i < N; i++)		field [y+p->y[i]][x+p->x[i]] = c;}int	find_hole (int x0, int* xstart, int* ystart){	int x, y, n;	for (x = x0; x <= SX; x ++)		for (y = 1; y <= SY; y++)			if (!field [y][x])	{				*xstart = x;				*ystart = y;				return 1;			}	return 0;}void	deep (int d, int x0);void	try_put (PAT * p, char c, int d, int x, int y){	int i;		y -= p->y0;	if (y < 1 || x + p->sx > SX+1 || y + p->sy > SY+1) return;	for (i = 0; i < N; i++)		if (field [y+p->y[i]][x+p->x[i]])			return;	put_fig (p, x, y, c);	if (d == 1)		disp ();	else		deep (d-1, x);	put_fig (p, x, y, 0);}void	deep (int d, int x0){	int i, j, x, y;	if (! find_hole (x0, &x, &y))		return;	for (i = 0; i < nfigs; i++)		if (! figs [i].used)	{			figs [i].used = 1;			for (j = 0; j < figs [i].n; j++)				try_put (&figs [i].pats [j], figs [i].c, d, x, y);			figs [i].used = 0;		}}void	search (void){	int i, j;	for (i = 0; i < nfigs; i++) figs [i].used = 0;	for (i = 0; i < SX+2; i++)		field [0][i] = field [SY+1][i] = '*';	for (i = 0; i < SY+2; i++)		field [i][0] = field [i][SX+1] = '*';	for (i = 0; i < nfigs; i++)	{		figs [i].used = 1;		for (j = 0; j < figs [i].n; j++)			if (figs [i].pats [j].sx <= SX &&			    figs [i].pats [j].sy <= SY)			{			//	printf (" %d. %d\n", i, j);				put_fig (&figs [i].pats [j], 1, 1, figs [i].c);				deep (nfigs-1, 1);				put_fig (&figs [i].pats [j], 1, 1, 0);			}		figs [i].used = 0;	}}#ifdef __linux__int main ()#elseint _cdecl main (void)#endif{    clock_t start=clock();	makefigs ();	search ();	clock_t endt=clock(); 	std::cout << nsols << std::endl;	std::cout <<"Time: " << double(endt-start)/CLOCKS_PER_SEC * 1000 << " ms\n"; 	return 0;}