回溯和分支限界解决的问题
回溯法的内涵
回溯法的一些实例
n皇后问题
这棵树实际上是对称的所以不用画后面的位于3 4 格开始的情况也可以得到其他解
伪代码如下
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include<math.h>
int x[15]={0};
int count=0;
int PLACE(int k)//检测第k个皇后能否放进棋盘
{
int i=1;
while(i<k)
{
if(x[i]==x[k]||fabs(x[i]-x[k])==fabs(i-k))
return 0;
i++;
}
return 1;
}
void NQUEENS(int n)
{
int k=1; //k为当前行号
x[1]=0;//x[k]为第k行皇后所放的列号
while(k>0)
{
x[k]++;
while(x[k]<=n&&!PLACE(k))//该列不符合,则放入下一列
x[k]++;
if(x[k]<=n)
{
if(k==n)
{
count++;
if(count==4)
{
printf("%d\n",count);
break;
}
printf("%d %d %d %d %d %d\n",x[1],x[2],x[3],x[4],x[5],x[6]);
}
else//判断下一行
{
k++; x[k]=0;
}
}
else k--;//没找到,则回溯
}
return ;
}
int main()
{
int n;
while(scanf("%d",&n)&&n!=0)
{
NQUEENS(n);
count =0;
}
return 0;
}
哈密顿回路问题
子集和数的问题
分支限界法
实例1:分配工作问题