八皇后有关问题的递归算法,为什么能输出好几个结果
八皇后问题的递归算法,为什么能输出好几个结果?
研究经典算法的时候对这个递归有点不大能理解,不知道为什么可以输出所有可能结果,我觉得输出一个结果之后就结束了啊。
请各位大神帮忙点化一下QAQ
------解决思路----------------------
因为 col 和 num 没实质性的算法关系,所以会有很多层递归,每层递归直到num=5结束
------解决思路----------------------
for (int col=1;col<=Queen;++col)
{
column[num] = col;
if (IsValid(num))
{
EightQueen(num+1);
}
}
for循环中一行一行遍历了所有可能的情况,第num行不冲突时,开始遍历下一行,
直到num=queen,输出,之后回到上一行继续遍历
------解决思路----------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
#include<stdio.h>
#include <math.h>
#define SUCCESS 1
#define FAIL 0
#define STATE bool
const int Queen = 5;
int column[Queen];
int number=0;
//输出函数
void Output()
{
++number;
printf("解法编号:%d\n",number);
for (int i=0;i<Queen;++i)
{
for (int j=0;j<Queen;++j)
{
if (column[i]-1==j)
{
printf(" Q");
}
else
printf(" .");
}
printf("\n");
}
printf("\n\n");
}
STATE IsValid(int num)
{
for(int i=0;i<num;++i)
{
//检查是否同列
if (column[i]==column[num])
{
return FAIL;
}
//检查是否同在一条斜线上
if (abs(column[i]-column[num])==(num-i))
{
return FAIL;
}
}
return SUCCESS;
}
//疑问:到底是怎么输出好几个结果的?
//我感觉输出一种结果就会结束这个函数啊
void EightQueen(int num)
{
//如果找到了一种解法,则输出
if (num==Queen)
{
Output();
}
else
{
for (int col=1;col<=Queen;++col)
{
column[num] = col;
if (IsValid(num))
{
EightQueen(num+1);
}
}
}
}
void main()
{
EightQueen(0);
}
研究经典算法的时候对这个递归有点不大能理解,不知道为什么可以输出所有可能结果,我觉得输出一个结果之后就结束了啊。
请各位大神帮忙点化一下QAQ
------解决思路----------------------
因为 col 和 num 没实质性的算法关系,所以会有很多层递归,每层递归直到num=5结束
------解决思路----------------------
for (int col=1;col<=Queen;++col)
{
column[num] = col;
if (IsValid(num))
{
EightQueen(num+1);
}
}
for循环中一行一行遍历了所有可能的情况,第num行不冲突时,开始遍历下一行,
直到num=queen,输出,之后回到上一行继续遍历
------解决思路----------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出