转载:http://zhedahht.blog.163.com/blog/static/2541117420114331616329
解决这个问题通常需要用递归,而递归对编程能力的要求比较高。因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力。
由于八个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占据一行。于是我们可以定义一个数组columnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先把columnIndex的八个数字分别用0-7初始化,接下来要做的事情就是对数组columnIndex做全排列。由于我们是用不同的数字初始化数组中的数字,因此任意两个皇后肯定不同列。我们只需要判断得到的每个排列对应的八个皇后是不是在同一对角斜线上,也就是数组的两个下标i和j,是不是i-j==columnIndex[i]-columnIndex[j]或者j-i==columnIndex[i]-columnIndex[j]。
#include<iostream>
using namespace std;
int g_number = 0;
void printQueen(int columnIndex[], int length)
{
printf("Solution %d\n", g_number);
for(int i = 0; i < length; i++)
printf("%d\t", columnIndex[i]);
printf("\n");
}
bool check(int columnIndex[], int length)
{
for(int i = 0; i < length; i++)
{
for(int j = i + 1; j < length; j++)
{
if(i - j == columnIndex[i] - columnIndex[j]
|| i - j == columnIndex[i] - columnIndex[j])
return false;
}
}
return true;
}
void permutation(int columnIndex[], int length, int index)
{
if(index == length)
{
if(check(columnIndex, length))
{
g_number++;
printQueen(columnIndex, length);
}
}
else
{
for(int i = index; i < length; i++)
{
int temp = columnIndex[index];
columnIndex[index] = columnIndex[i];
columnIndex[i] = temp;
permutation(columnIndex, length, index + 1);
temp = columnIndex[index];
columnIndex[index] = columnIndex[i];
columnIndex[i] = temp;
}
}
}
void eightQueen()
{
const int queens = 8;
int columnIndex[queens];
for(int i = 0; i < queens; i++)
{
columnIndex[i] = i;
}
permutation(columnIndex, queens, 0);
}
int main()
{
eightQueen();
return 0;
}