题意:求八皇后的摆法
显然8个皇后肯定是不能在同一行的,因此只需要考虑8个皇后列的摆法,使用数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。首先对ColumnIndex使用0~7进行初始化,然后对ColumnIndex进行全排列,关于排列请看我前面写的《字符串的全排列》,之后对得到的各个排列进行判断,看是否满足条件。由于8个皇后已经是在不同的行和列上了,现在只需判断是否存在两个以上的皇后在同一条对角线上,因此判断条件为:i - j == ColumnIndex[i] - ColumnIndex[j] 或 j - i == ColumnIndex[i] - ColumnIndex[j],如上有一个成立则不满足条件
int queueNum = 0;
vector<int> queue;
void PrintQueue()
{
cout << queueNum << " queue: ";
for(vector<int>::iterator iiter = queue.begin(); iiter != queue.end(); iiter++)
cout << *iiter << " ";
cout << endl;
}
bool check()
{
for(vector<int>::iterator iiter = queue.begin(); iiter != queue.end(); iiter++)
{
for(vector<int>::iterator jiter = iiter + 1; jiter!= queue.end(); jiter++)
{
if((iiter - jiter) == (*iiter - *jiter) || (iiter - jiter) == (*jiter) - (*iiter))
return false;
}
}
return true;
}
void Permutation(vector<int>::iterator first, vector<int>::iterator last)
{
if(first == last)
{
if(check())
{
queueNum++;
PrintQueue();
}
return;
}
for(vector<int>::iterator iiter = first; iiter != last; iiter++)
{
iter_swap(iiter, first);
Permutation(first + 1, last);
iter_swap(iiter, first);
}
}