#include
using namespace std;
#define MAX 8
int arr[MAX][MAX];
int num=0;
bool place(int i, int j) //判断第i行第j列能不能放皇后
{
for (int m = 0; m < 8; m++)
{
if (arr[m][j] == 1)
return false; //判断第j列的0-7行有没有放皇后
}
for (int x= 0; x < 8; x++)
{
for (int y = 0; y < 8; y++)
{
if (abs(x - i) == abs(y - j) && arr[x][y] == 1)
return false;
}
}
return true;
}
void DFS(int v) /7代表摆放第v个皇后
{
int i, j;
int flag = 1;
if (v ==MAX)
{
num ++;
return;
}
else
{
for (i = 0; i < 8; i++)
{
if (arr[v][i])
{
flag = 0;
break;
}
}
if (flag)
{
for (j = 0; j < 8; j++)
{
if (place(v, j))
{
arr[v][j] = 1;
DFS(v + 1);
arr[v][j] = 0;
}
}
}
else
{
DFS(v + 1);
}
}
}
int main()
{
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
cin >> arr[i][j];
}
DFS(0);
cout << num << endl;
return 0;
}
这没有什么时间复杂度,所谓时间复杂度,你要有一个问题规模变量n,比如说n皇后问题,那么才可以讨论时间复杂度
8皇后问题,问题规模固定死了,那么时间就是一个常量,常量有什么复杂度。
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题[百度百科]。
英文:Write an algorithm to print all ways of arranging eight queens on a chess board so that none of them share the same row, column or diagonal.