八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
1 #include<stdio.h> 2 void fun(int i,int j); 3 static b[8][8]; 4 void main() 5 { 6 fun(0,0); 7 8 } 9 int knock(int i,int j) 10 {int temp_i,temp_j,k; 11 temp_i=i;temp_j=j; 12 for(i=i-1;i>=0;i--) 13 if(b[i][j]==1) 14 return 1; 15 for(i=temp_i-1,k=temp_j+1,j=temp_j-1;i>=0;i--,j--,k++) 16 {if(j>=0&&b[i][j]==1) 17 return 1; 18 if(k<8&&b[i][k]==1) 19 return 1; 20 } 21 return 0; 22 } 23 void cls(int i) 24 {int j; 25 for(;i<8;i++) 26 { 27 for(j=0;j<8;j++) 28 b[i][j]=0; 29 } 30 31 } 32 void print(void) 33 {int i,j;static int n=1; 34 printf("--------------------------\n第%d种\n",n++); 35 for(j=0;j<8;j++) 36 { 37 for(i=0;i<8;i++) 38 {if(b[i][j]==1) 39 printf("* "); 40 else 41 printf("0 "); 42 } 43 printf("\n"); 44 45 } 46 printf("\n");// getchar(); 47 } 48 void fun(int i,int j) 49 {if(i<8) 50 { 51 for(;j<8;j++) 52 {cls(i); 53 if(knock(i,j)==1) 54 continue; 55 b[i][j]=1; 56 fun(i+1,0); 57 } 58 59 } 60 else 61 print(); 62 }
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>