由于棋盘有行列之分,示例是按列坐标划分的。如果一个合适的列坐标为{1,5,8,6,3,7,2,4}
因此转化为集合X={1,2,3,4,5,6,7,8}中哪些列排列的向量符合题中要求
满足要求的向量有两点:
>不能同行同列。由于在向量X中没有重复元素,保证了不能同行同列
>不能在对角线上。这一点需要函数判定,不难看出两个皇后在同一对角线上,当且仅当abs(X[i]-X[j])=abs(i-j)。
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
bool ValidOrder(int *start,int *end)
{
int nSize = end - start;
for(int i = 0; i< nSize - 1; i ++)
{
for(int j = i + 1; j < nSize ;j ++)
{
if(j - i == abs(*(start+i) - *(start+j)))
{
return false;
}
}
}
return true;
}
int main()
{
int a[] = {1,2,3,4,5,6,7,8};
do
{
if(ValidOrder(a,a+8))
{
copy(a,a+8,ostream_iterator<int>(cout,"\t"));
cout << endl;
}
}while(next_permutation(a,a+8));
return 0;
}