八皇后问题:8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在一行、同一列或者同意对角线上。请问一共有多少种摆法?
#include<iostream>
using namespace std;
bool check_duijiao(int A[],int length){
if(A==NULL || length<=0){
return false;
}
for(int i = 0 ; i <= length ; ++i){
for(int j = i+1 ; j <= length ; ++j){
if( ( (i-j) == ( A[i]-A[j] ) )|| ( (j-i) == ( A[i] - A[j] ) ) ){
return false;
}
}
}
return true;
}
void count_case(int A[],int length,int index,int &num){
if(A==NULL || length<=0 || index<0){
return;
}
if(index == length){
if( check_duijiao( A, length )){
num++;
}
return;
}else{
for(int p = index; p <= length ; ++p){
swap(A[index],A[p]);
count_case(A,length,index+1,num);
swap(A[index],A[p]);
}
}
}
int Queen_case(){
const int index = 8;
int A[index];
for(int i = 0 ; i < index ;++i){
A[i] = i;
}
int result=0;
count_case(A,index-1,0,result);
return result;
}
int main(){
int i = Queen_case();
cout<<i<<endl;
system("pause");
return 0;
}
定义一个数组A【8】,数组第i个数字表示位于第i行的皇后的列号。先把数组A的八个数字初始化成0~7,接下来就是对这8个数字进行全排列,然后将符合情况的排列进行计数即可。
小贴士:
如果是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后在一一判断每个排列是不是满足题目给定的要求