您的位置:首页 > 职场人生

剑指OFFER————面试题28八皇后问题

2014-10-16 10:19 183 查看
八皇后问题: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个数字进行全排列,然后将符合情况的排列进行计数即可。

小贴士:

如果是按照一定要求摆放若干个数字,我们可以先求出这些数字的所有排列,然后在一一判断每个排列是不是满足题目给定的要求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: