n后问题就是有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。
代码实现
这里采用的是暴力递归法:
#include <stdio.h>
#include <malloc.h>
#include <math.h>
bool place(int* paraSolution,int paraT)
{
int j;
for(j = 1;j < paraT;j ++)
{
if((abs(paraT - j) == abs(paraSolution[j] - paraSolution[paraT])) || (paraSolution[j] == paraSolution[paraT]))
{
return false;
}
}
return true;
}
void backtracking(int* paraSolution,int paraN,int paraT)
{
int i;
if(paraT > paraN)
{
for(i = 1;i <= paraN;i ++)
{
printf("%d",paraSolution[i]);
}
printf("\r\n");
}else
{
for(i = 1;i <= paraN;i ++)
{
paraSolution[paraT] = i;
if(place(paraSolution,paraT))
{
backtracking(paraSolution,paraN,paraT + 1);
}
}
}
}
void nQueen(int paraN)
{
int i;
int* solution = (int*)malloc((paraN + 1) * sizeof(int));
for(i = 0;i <= paraN;i ++)
{
solution[i] = 0;
}
backtracking(solution,paraN,1);
}
int main()
{
nQueen(5);
return 1;
}
运行结果
13524
14253
24135
25314
31425
35241
41352
42531
52413
53142