// G90 // 85 lineas
// https://en.wikipedia.org/wiki/Eight_queens_puzzle
#include<stdio.h>

#define MAX_REINAS	8
#define MAX_SIZE	8
#define REINA	'r'
#define VACIA	' '
#define TRUE	1
#define FALSE	0

typedef struct {
	int	f; // 1..8
	char	c; // a..h
} t_reina;

typedef struct {
	int	reinas;
	t_reina	r[MAX_REINAS];
} t_reinas;

typedef struct {
	int	size;
	char	c[MAX_SIZE][MAX_SIZE];
} t_tablero;

int main(){
	t_reinas rs;
	t_tablero t;
	int i, j, f, c;
	int sin_amenazas;

	printf("Problema de las ocho reinas\n");
	printf("Cuantas reinas introduciras? ");
	scanf("%d%*c", &rs.reinas);

	for(i=0;i<rs.reinas;i++) {
		do {
			printf("Introduce posicion de reina %d [a1..h8]: ", i);
			scanf("%c%d%*c", &rs.r[i].c, &rs.r[i].f);
		} while (rs.r[i].c<'a' || rs.r[i].c>='a'+rs.reinas ||
			rs.r[i].f<1 || rs.r[i].f>+rs.reinas);
	}

	t.size = rs.reinas;
	for(f=0;f<t.size;f++) {
		for(c=0;c<t.size;c++) {
			t.c[f][c] = VACIA;
		}
	}

	for(i=0;i<rs.reinas;i++) {
		t.c[rs.r[i].f-1][rs.r[i].c-'a'] = REINA;
	}

	printf("\n abcdefgh\n");
	for(f=t.size-1;f>=0;f--) {
		printf("%d", f+1);
		for(c=0;c<t.size;c++) {
			printf("%c", t.c[f][c]);
		}
		printf("%d\n", f+1);
	}
	printf(" abcdefgh\n");

	sin_amenazas = TRUE;
	for(i=0;i<rs.reinas;i++) {
		for(j=i+1;j<rs.reinas;j++) {
			if ((rs.r[i].f == rs.r[j].f) ||
			    (rs.r[i].c == rs.r[j].c) ||
			    (rs.r[i].f-rs.r[j].f == rs.r[i].c-rs.r[j].c) ||
			    (rs.r[i].f+rs.r[i].c == rs.r[j].f+rs.r[j].c)
			   ) {
				printf("Reinas en %c%d y en %c%d se amenazan\n", rs.r[i].c, rs.r[i].f, rs.r[j].c, rs.r[j].f);
				sin_amenazas = FALSE;
			}
		}
	}

	if (sin_amenazas) {
		printf("Ninguna reina amenaza a ninguna otra\n");
	}

	return 0;
}

