八皇后的问题非常有名,初次理解可能稍有难度,不过多看书,看博客和代码,几遍下来,也基本清晰。
首先不用想初始的情况,先假设前面已经排列好了几个皇后,即将排列下一个皇后。依次遍历八个位置,然后与之前的进行判断这个位置是否可行,如可行则进行下一个皇后,否则则移动位置继续判断。很简单。但是有两个个问题:
1、不全,某个位置有八种方法排列,你只用了一种,当然你可以每个位置遍历,但太耗时,回溯法可以解决很大的一部分问题,即当你在对某一行皇后进行放置时,如果一直放不好(到最后),那后面的行就不需要再遍历了,直接回溯上一行,将上一行的位置后移——依次进行这个步骤,直到第一行,遍历结束。
2、如何判定当前位置合法?首先,两个皇后不能同一列(这里要注意,算法的遍历次序是按行来的,所以不必考虑行的情况),其次,不能斜对角。
代码如下,很清晰:
#define N 8
/*
Place(),第一个参数表示八皇后的列位置,第二个表示当前要插入的八皇后的行数。
*/
bool Place(int eightqueen[],int k)
{