2019-12-22
//****************************************************************************************
//* 程序名: 八皇后问题(递归) *
//* 编制时间 2017/11/1 *
//* 编制人 小小书童
// problem: 在 8 * 8 的棋盘上 ,放置8个皇后(棋子),使两者之间不攻击,所谓不攻*
// 击就是说任何两个 皇后都要满足 3个条件 *
// 不在棋盘同一列 ,同一行 ,同一对角线 *
/*****************************************************************************************/
#include <iostream>
const int res = 9 ;
int Num ;
int Q[9] ; //因为8*8 ,每行都应有个皇后, Q[i] : 第 i 行皇后所在的列
bool C[9] ; //标记数组
bool L[17] ;
bool R[17] ;
using namespace std;
void Try(int i)
{
for(int j =1 ; j< 9 ; j++){
if(C[j]&&L[i-j+res]&&R[i+j]){ //行列试探 i-j+res 左边对角
Q[i] = j ;
C[j] =false ;
L[i-j+res] =false ;
R[i+j] =false ;
if(i <8)
Try(i+1) ;
else {
Num++ ;
cout<<"方案数"<<Num<<":"<<endl ;
for(int k =1 ; k<=8 ;k++)
cout<<Q[k]<<" " ;
cout<<endl ;
}
C[j] = true ; //回溯
L[i-j+res] =true ;
R[i+j] =true ;
}
}
}
int main()
{
Num = 0 ;
for(int i = 0 ; i < 9 ; i++)
C[i]=true ;
for(int i = 0 ; i <17 ;i++)
L[i]=R[i] = true ;
Try(1) ;
return 0;
}