八皇后问题(C++)

1、问题描述:在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。

2、关键字:递归、上溯

3、技巧:

1)、
经观察发现,对8 x 8的二维数组上的某点a[i][j](0<=i,j<=7)
其主对角线(即左上至右下)上的每个点的i-j+7的值(范围在(0,14))均相等;
其从对角线(即右上至左下)上的每个点的i+j的值(范围在(0,14))均相等;
且每个主对角线之间的i-j+7的值均不同,每个从对角线之间的i-j+7的值亦不同;

如a[3][4]:
主:3-4+7=6
从:3+4=7

因此可设两个数组b[15],c[15]分别表示主、从对角线是否安全
(为1表示有皇后,不安全;为0表示安全)

2)、

每行有且仅有一个皇后:
每i个皇后放在每i行(0<=i<=7)
void eightQueens( int line );

4、源码(C++)

 

[cpp]  view plain  copy  print ?
  1. //eight_queens.cpp  
  2. #include <iostream>  
  3. using namespace std;  
  4. int data[ 8 ][ 8 ]; //chess(double dimensional array)  
  5. int a[ 8 ];   //column(列)  
  6. int b[ 15 ];  //主对角线(左上至右下)  
  7. int c[ 15 ];  //从对角线(右上至左下)  
  8. int count = 0;  
  9.    
  10. void eightQueens( int );  
  11. void output( const int [][ 8 ], int );  
  12.    
  13. int main()  
  14. {  
  15.  int i, j;  
  16.    
  17.  for( i = 0; i < 15; ++i ) //主、从对角线  
  18.   b[ i ] = c[ i ] = 0; //表示安全  
  19.   
  20.  for( i = 0; i < 8; ++i )//chess  
  21.  {  
  22.   a[ i ] = 0;    //i列安全  
  23.   for( j = 0; j < 8; ++j )  
  24.    data[ i ][ j ] = 0;  
  25.  }  
  26.    
  27.  eightQueens( 0 );  
  28.   
  29.  cout << "/ncount = " << count << endl;  
  30.  return 0;  
  31. }  
  32.    
  33. void eightQueens( int line )  
  34. {  
  35.  if( 8 == line )//八个皇后安置就位,输出  
  36.  {  
  37.   output( data, 8 );  
  38.   cout << endl;  
  39.   return;  
  40.  }  
  41.    
  42.   
  43.  forint column = 0; column < 8; ++column )  
  44.  {  
  45.   if( 0 == a[ column ] && 0 == b[ line - column + 7 ] && 0 == c[ line + column ] )  
  46.   {  
  47.    data[ line ][ column ] = 1; //  
  48. 安置皇后  
  49.    a[ column ] = 1;   //此列被占  
  50.    b[ line - column + 7 ] = 1; //主对角线被占  
  51.    c[ line + column ] = 1;  //从对角线被占  
  52.    eightQueens( line + 1 ); //下一个皇后  
  53.    //重置  
  54.    data[ line ][ column ] = 0;  
  55.    a[ column ] = 0;  
  56.    b[ line - column + 7 ] = 0;  
  57.    c[ line + column ] = 0;  
  58.   }  
  59.  }  
  60. }  
  61.    
  62. //output chess  
  63. void output( const int data[][ 8 ], int size )  
  64. {  
  65.  forint i = 0; i < size; ++i )  
  66.  {  
  67.   forint j = 0; j < size; ++j )  
  68.    cout << data[ i ][ j ] << ' ';  
  69.   cout << endl;  
  70.  }  
  71.  ++count;  
  72. }  

5、性能:

时间复杂度O(n^2)

 

6、测试

环境:VC++6.0

 

 

7、后记:

算法是我在《程序员面试宝典》第8章面试例题2的基础上,做了一定的修改。

 此外,我还想做进一步修改:把eightQueens函数做成一个封装的函数,

eightQueens( int a[][ 8 ], int n ).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值