一个8*8方盘,每个皇后不能再同一行、同一列、同一对角线上,我们可以忽略行(即不保存行,不申请二维数组),直接从第一行算,然后算第二行的皇后,maze[i] = j; 代表着第i行第j列有着一个皇后,我们直接从行开始算,每次判断是否有不符合规则的皇后,因为不计算行,所以 只需判断
(x == j)|| (maze[x] == maze[j])|| ((x - j) == (maze[x] - maze[j])) || ((j - x) == (maze[x] - maze[j]))
满足上面条件则不符合
代码如下:
#include<iostream>
#include <cstring>
using namespace std;
const int N = 8;
int maze[12], count = 0;
void print()
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
if(maze[i] == j)
{
cout << "1"; //<< "\t";
}
else
{
cout << "0"; //<< "\t";
}
}
cout << endl;
}
cout << endl;
}
void search(int x)
{
if(N == x)
{
print();
count++;
return ;
}
int Is_success;
for(int i=0;i<N;i++) //列计算
{
maze[x] = i; //第X行第I列
Is_success = 1;
for(int j = 0; j < x; j++)
{
if((x == j)// || AND && 低于关系运算符
|| (maze[x] == maze[j])// ! 高于关系运算符
|| ((x - j) == (maze[x] - maze[j]))
|| ((j - x) == (maze[x] - maze[j])))
{
Is_success = 0;
break;
}
}
if(Is_success)
{
search(x+1);
}
}
}
int main()
{
search(0);
cout << "total = " << count << endl;
return 0;
}
运行结果,总共92种解法