大学最后时光补漏之:八皇后问题(回溯法)

 解这种问题,回溯是一个很好的方法,容易实现

  
  
  
  
  1. #include <iostream> 
  2. using namespace std; 
  3.  
  4. #define QUEEN_NUM 8 
  5. int count = 0
  6. int isCorrect(int i,int j,int Q[QUEEN_NUM][QUEEN_NUM]){ 
  7.     int row,col; 
  8.      
  9.     for(row=0;row<QUEEN_NUM;row++) 
  10.         if(Q[row][j] == 1 && row != i)return 0; 
  11.     for(col=0;col<QUEEN_NUM;col++) 
  12.         if(Q[i][col] == 1 && col != j)return 0; 
  13.     for(row=i-1,col=j-1;row>=0 && col>=0;row--,col--)//左上 
  14.         if(Q[row][col] == 1 && row!=i && col!=j)return 0; 
  15.     for(row=i+1,col=j-1;row<QUEEN_NUM && col>=0;row++,col--)//左下 
  16.         if(Q[row][col] == 1 && row!=i && col!=j)return 0; 
  17.     for(row=i+1,col=j+1;row<QUEEN_NUM && col<QUEEN_NUM;row++,col++)//右下 
  18.         if(Q[row][col] == 1 && row!=i && col!=j)return 0; 
  19.     for(row=i-1,col=j+1;row>=0 && col<QUEEN_NUM;row--,col++)//右上 
  20.         if(Q[row][col] == 1 && row!=i && col!=j)return 0; 
  21.  
  22.     return 1; 
  23.  
  24. void Queen(int j,int Q[QUEEN_NUM][QUEEN_NUM]){ 
  25.     if(QUEEN_NUM == j){ 
  26.         for(int i = 0;i<QUEEN_NUM;i++){ 
  27.             for(int k = 0;k < QUEEN_NUM;k++){ 
  28.                 cout<<Q[i][k]; 
  29.             } 
  30.              cout<<endl
  31.         } 
  32.         
  33.         cout<<endl
  34.         count++; 
  35.     } 
  36.     for(int i=0;i<QUEEN_NUM;i++){ 
  37.         if(isCorrect(i,j,Q)){ 
  38.             Q[i][j] = 1; 
  39.             Queen(j+1,Q); 
  40.             Q[i][j] = 0;//如果没有可能或子函数执行完,回溯,位置变量重新置为0 
  41.         } 
  42.     } 
  43.  
  44.  
  45. int main(){ 
  46.     int Q[QUEEN_NUM][QUEEN_NUM]; 
  47.     int i,j; 
  48.     for(i=0;i<QUEEN_NUM;i++){ 
  49.         for(j=0;j<QUEEN_NUM;j++){ 
  50.             Q[i][j] = 0; 
  51.         } 
  52.     } 
  53.     Queen(0,Q); 
  54.     cout<<"count:"<<count<<endl
  55. system("pause"); 
  56. return 0; 

 ps.存储棋盘其实用一维的数组就可以了,结合下标进行。

你可能感兴趣的:(八皇后,n皇后问题)