/**********************
Mini-Concurso de programacion

El concursante debe implementar:
	Estructuras Casilla y Tablero
	Funciones calculaNuevaPosicion, verificaPosicion y imprimeTablero.
Se puede aņadir o eliminar cualquier cosa del codigo en esas estructuras o funciones.
***********************/

#include	<stdio.h>

typedef struct {
	long ltablero;
}Tablero;

void calculaNuevaPosicion( Tablero *ptablero1 ){
	(ptablero1->ltablero)++;
	return;
}

int verificaPosicion( Tablero *ptablero1 ){
	int i, j;
	long valuei, valuej;
	for( i = 0, valuei = ptablero1->ltablero ; i < 8 ; i++, valuei >>= 3 ){
		for( j = i+1 , valuej = valuei>>3 ; j < 8 ; j++, valuej >>= 3 ){
			/*	Fila?							Diagonal /?								Diagonal \?	*/
			if( (valuei&0x7) == (valuej&0x7) || (valuei&0x7) == (valuej&0x7)+(j-i) || (valuei&0x7) == (valuej&0x7)-(j-i) )
				return 0;
		}
	}
	return -1;
}

void imprimeTablero( Tablero *ptablero1 ){
	int i;
	long valuei;
	for( i = 0, valuei = ptablero1->ltablero ; i < 8 ; i++, valuei >>= 3 ){
		printf("%08lx\n", 0x1L << ((valuei&0x7)*0x4) );		//printf("%08lx\n", 0x1L << ((((ptablero1->ltablero)>>(i*3))&0x7)*0x4) );
	}
	return;
}





int main(){
	
	int i;
	long tested = 0;
	Tablero tablero1 = {0x0L};
//	tablero1.ltablero = 0x0013D58B;	// Tablero valido de prueba.
	
	printf("www.TODOPIC.com.ar\n");
	printf("Mini-Concurso de progracion en C, Parte 2:\n");
	printf("Las 8 reinas.\n");
	printf("Nombre del concursante: Jose Antonio Garcia Peiro");
		
	for( i = 1 ; i <= 92 ; i++ ){
		while( !verificaPosicion( &tablero1 ) ){
			tested++;
			calculaNuevaPosicion( &tablero1 );
		}
		printf( "\nTableros comprobados: %ld", tested );
		printf( "\nSolucion %d de 92:\n", i );
		imprimeTablero( &tablero1 );
		calculaNuevaPosicion( &tablero1 );	// Modificacion necesaria para que el main.c funcione correctamente.
	}

	printf("\n\nTest terminado.");
	return 0;
}

