#include <stdio.h>

#define DIM 12
int brett [DIM][DIM];

int counter = 0;

void print_field()
{
	int i,j;
	
	for (i=0;i<DIM;i++)
		printf ("--");
	printf ("\n");
	
	for (i=0;i<DIM;i++)
	{
		for (j=0;j<DIM;j++)
		{
			printf ("%d ",
				brett[i][j]);
		}
		printf ("\n");
	}
}

int clean_brett ()
{
	int i;
	for (i=0; i<DIM*DIM;i++)
	{
		brett[i/DIM][i%DIM] = 0;
	}
}

/**Überprüft Diagonalen und Zeilenweise
 * und gibt 1 zurück, wenn korrekte Position*/
int verify()
{
	int i,j;
	
	for (i=0; i< DIM*DIM;i++)
	{
		/**Suche Damen am Brett*/
		if (brett[i/DIM][i%DIM])
		{
			/**Gerade Lösungen überprüfen*/
			for (j=0; j<DIM; j++)
			{
				if (brett[j][i%DIM] == 1
					&& j != i/DIM)
					return 0;
				if (brett[i/DIM][j] == 1
					&& j != i%DIM)
					return 0;
			}
			/**Diagonalen überprüfen*/
			for (j=-DIM+1; j<DIM; j++)
			{
				if (!j) continue;
		
				if (i/DIM+j >= DIM) goto CHECK;
				if (i/DIM+j < 0) goto CHECK;
				if (i%DIM+j >= DIM) goto CHECK;
				if (i%DIM+j < 0) goto CHECK;

				if (brett[(i/DIM)+j][(i%DIM)+j])
					return 0;
CHECK:
				if (i/DIM+j >= DIM) continue;
				if (i/DIM+j < 0) continue;
				if (i%DIM-j >= DIM) continue;
				if (i%DIM-j < 0) continue;
				
				if (brett[(i/DIM)+j][(i%DIM)-j])
					return 0;
			}
		}
	}
	return 1;
}

void calc (int ebene)
{
	int i;

	if (ebene < 0)
	{
		if (verify())
		{
			print_field();
			counter ++;
		}
		return;
	}
	
	for (i=0; i< DIM;i++)
	{
		brett [ebene][i] = 1;
		calc (ebene-1);
		brett [ebene][i] = 0;
	}
}

				

int main ()
{
	calc (DIM-1);
	printf ("Lösungen: %d\n", counter);
	return 0;
}


