八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相***,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

 

   
   
   
   
  1. #include 
  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.          }