解决N皇后问题用到了回溯算法。
回溯算法是一种试探算法。每一步都有多种尝试的可能性,是递归算法的变式,递归和回溯的区别我认为在于,在归的途中做的事情不一样,递归的每一次归都是确切的答案,而回溯的话,在归的时候。每一步都可能有多种尝试的可能。因为一个结点不成立,其子节点就不必再进行尝试,所以节约了很多空姐和时间
思考N皇后问题时,我们引入了一个二维平面,所以我想写程序的时候应该也要使用一个二维数组才能实现,但是程序只用了一个一维数组就实现了。
我认为N皇后问题的难处一个是回溯的实现,另一个是判断当前位置是不是可以放置皇后。
一维数组确实能解决判断的问题,假设数组以p【】表示,两个皇后位于a行和b行。
不成立的情况有两种,一种是两个皇后位于一列,只要查看p[a]是否与p[b]相等即可判断
另一种是两个皇后位于斜线,只要查看|a-b|和|p[a]-p[b]|是否相等即可判断。
下面是程序以及运行结果
#include <stdio.h>
#include <malloc.h>
#include <math.h>
/**
* Place it there, applicable?
*/
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;
}//Of for
return true;
}//Of place
/**
* Backtracking.
*/
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);
}//Of for i
}//Of if
}//Of backtracking
/**
* Title: n queens.<br>
*/
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);
}//Of nQueen
/**
* The entrance.
*/
int main(){
nQueen(5);
return 1;
}//Of main