回溯法:递归是, 生成和检验过程有机结合起来,若出现冲突,则递归函数不是调用自身,而是返回上一层。
八皇后问题:
void search( int cur) //cur 表示放皇后的行标
{
int tot; //表示解的个数
if(cur==n)
{
tot++;
}
else
{
for(int i=0;i<n;i++)
{
int ok=1;
c[cur]=i; //尝试将当前行的皇后放到第i列
for(int j=0;j<cur;j++ ) //检查是否和前面的皇后有冲突
{
if(c[j]==c[cur]||cur-c[j]==j-c[j]||cur+c[cur]==j+c[j])//检验纵向和横向的冲突
{
ok=1;
break; //不成立
}
else if(ok) search(cur+1); //成立,放下一行的皇后
}
}
}
}