#include <stdio.h>

#define besetzt 1 
#define frei 0

int Feld[8]; 
long Anzahl;

Setze_Dame(Reihe,Maske) 
  register int Reihe,Maske; 
  { register int Spalte; 
		 
	 for(Spalte=1;Spalte<=0xff;Spalte<<=1) 
	  { if((Maske&Spalte)==0)	/*ist spalte frei*/ 
			{ Feld[Reihe]=Spalte;/*merken */  
			  if(diagonal(Reihe)==frei)					 
				 {  if(Reihe>=7) Anzahl++;/*loesung*/ 
					 else Setze_Dame(Reihe+1, 
											(Maske|Spalte)); 
				 } 
			} 
	  } 
  }	   
   
diagonal(Reihe) 
  register int Reihe; 
  {	register int i,*Testreihe,links,rechts; 
		Testreihe=Feld+Reihe; 
		links=rechts=*Testreihe--; 
		for(i=1;i<=Reihe;i++,Testreihe--) 
			  /*rckw„rts ber alle reihen*/ 
		 { links<<=1;	/*diagonalenmasken*/ 
			rechts>>=1; 
			if((*Testreihe&links)||/*ist besetzt?*/ 
				(*Testreihe&rechts)) return(besetzt); 
		 } 
		return(frei);/* diagonalen sind frei*/ 
  } 
		   
main() 
  { Setze_Dame(0,0);/* arbeiten tun immer*/ 
						  /*	 die anderen	  */ 
	 printf("es gibt %ld Loesungen\n",Anzahl); 
  } 
	 
			 
                                                                                    