八皇后问题
(1)逐行放置,检测位置是否合法只需要检测是否同列,是否同对角线,是否同反对角线;
(2)采用一维数组保存皇后位置(record[i]的含义为第i行皇后所处位置为record[i]);
(3)对角线的斜率是1,反对角线的斜率为-1,若两个皇后的位置为(xi,yi)(xj,yj),则只需要|xi-xj| != |yi-yj| 且 yi != yj,位置便是合法的;
#include <iostream>
#include <cmath>
using namespace std;
int counter = 0;
int N = 8;
int record[8];//第i行的第record[i]列放置了一个皇后
void func(int curRow)
{
if (curRow == N)
counter++;
else
for (int i = 0; i < N;i++)
{
bool isOk = true;
record[curRow] = i;//尝试将第cur行的皇后放在第i列
for (int j = 0; j < curRow; j++)//
{
if (record[curRow] == record[j] ||
abs(curRow - j) == abs(record[curRow] - record[j]))
{
isOk = false;
break;
}
}
if (isOk)//如果放置合法 那么进行下一行的放置
func(curRow + 1);
}
}
int main()
{
func(0);
cout << counter << endl;
return 0;
}
欢迎大家批评指正~