数据结构之N皇后问题(C语言)
·
一、N皇后问题的概念
n 皇后问题,研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 一个皇后可以向水平、垂直以及向斜对角方向移动,如果一个皇后出现在另一个皇后的同一行,同一列或者斜对角,那它就可以被这个皇后攻击。可以通过列举出在棋盘上所有的情况,然后判断每个组合是不是符合的条件。

二、代码步骤
三、代码功能
1、对皇后位置对错的判断

bool place(int* paraSolution, int paraT)
{
int j;
for(j = 1;j < paraT;j++)
{
if(abs(paraT-j) == abs(paraSolution[paraT]-paraSolution[j]) || paraSolution[paraT] == paraSolution[j])
return 0;
}
return 1;
2、递归实现N皇后位置的排列
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);
}
}
}
}
3、定义N皇后的指针并初始化
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);
}
4、代码入口
int main()
{
nQueen(5);
return 1;
}
5、运行结果
1 3 5 2 4
1 4 2 5 3
2 4 1 3 5
2 5 3 1 4
3 1 4 2 5
3 5 2 4 1
4 1 3 5 2
4 2 5 3 1
5 2 4 1 3
5 3 1 4 2
四、整体代码
#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[paraT]-paraSolution[j]) || paraSolution[paraT] == paraSolution[j])
return 0;
}
return 1;
}
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;
}
更多推荐



所有评论(0)