剑指offer上的思路,变换了下用来解决八皇后问题
递归思想
//为了简化问题,我们将原本应使用的二维数组,巧妙的转换成了一维数组
//用ColumnIndex数组来表示,用ColumnIndex[i]来表示第i行,处于哪一列
//数组我们初始化为,元素与下标相同
//进行元素的全排列也就是0-7的全排列
//然后对每一种情况进行判断:是否不在一个对角线上
//满足条件,num++
//为了保证能够进行所有的全排列,进行验证,每次都更新number
#include <iostream>
//#include <vector>
using namespace std;
int ColumnIndex[] = {0,1,2,3,4,5,6,7};
int num = 0; //任意两个不在对角线上
int number = 0; //全排列数目
void Permutation (int* p, int index)
{
int diagflag = 0;
//递归结束的条件
if(index == 8){
//打印全排列
for(int i=0; i<=7;i++)
cout<<p[i];
cout<<endl;
number++;
for(int j = 0; j <=7; j++){
for(int k = 0; k <= 7; k++){
//当处于对角线的时候,将diagflag置1,意味着,有两个元素刚好处于对角线状态
//其中j!=k是用来表示,两个点不重合
//当存在对角线元素时,结束循环,要同时结束两层循环
if(abs(j-k)==abs(p[j]-p[k])&&(j!=k)){
diagflag = 1;
break;
}
}
//当存在对角线元素时,提前结束循环(外层循环)
//所以多加一个判断
if(diagflag==1)
break;
}
//不在对角线上
if(diagflag==0)
num++;
cout<<num<<' '<<number<<endl;
}
else //进行全排列的核心代码
for(int i = index; i<=7;++i){
int tmp = p[i];
p[i] = p[index];
p[index] = tmp;
Permutation(p,index+1);
tmp = p[i];
p[i] = p[index];
p[index] = tmp;
}
//cout<<num<<endl;
}
int main()
{
Permutation(&ColumnIndex[0], 0);
}