/* titel: dame.c 8 Damen (und mehr) */
#include <stdio.h>

#define ZZ   20             /*  Zahl der Zeilen und Spalten   */
int max, DAME[ ZZ ], ZEILE[ ZZ ], DIA0[ 2*ZZ-1 ], DIA1[ 2*ZZ-1 ];

int versuche(int i){
  int j, q;
  for (j = q = 0; q == 0 && j < max; j++) {
    if ( ZEILE[j] == 0 && DIA0[i+j] == 0 && DIA1[i-j+max-1] == 0 ) {
       DAME[i] = j+1;
       ZEILE[j] = DIA0[i+j] = DIA1[i-j+max-1] = 1;
       if (i == max - 1)
         q = 1;
       else
         if ( (q = versuche(i+1) ) == 0)
           ZEILE[j] = DIA0[i+j] = DIA1[i-j+max-1] = 0;
    }
  }
  return q;
}

int main() {
  int i;
  printf("Welche Zahl ( < %d, Abbruch mit 0) ? ", ZZ);
  while( scanf("%d", &max)==0 ) {
    getchar();
    printf("Falsche Eingabe, bitte Zahl eingeben: ");
  }
  if (max <=  0) return 0;
  if (max >= ZZ) max = ZZ-1;

  for (i=0; i<  max; i++) DAME[i] = ZEILE[i] = 0;
  for (i=0; i<2*max; i++) DIA0[i] = DIA1 [i] = 0;

  if ( versuche(0) ) {
    for (i=0; i < max; i++)
      printf("%d ", DAME[i]);
    printf("\n");
  }
}
