回朔算法

程序设计中,有这样一类问题:求一类解,或求全部解,或求最优解的问题(例如 八皇后问题),不是根据某种确定的算法设计法则,而是利用试探和回朔的搜索技术求解.
回朔还是设计 递归算法的重要方法,其求解过程实质:是一个先序遍历一棵"状态树"但是这棵树不是在遍历前预先建立的,而是隐含在遍历过程中.
为了应用回朔,所求的解必须能表示成一个n元组(x1,x2,…,xn),其中xi是取自某个有穷集si.下面给出n皇后的程序代码,给出代码前先描述问题:在一个n×n的棋盘上放置n个皇后,且使得每两个皇后之间不能相互"攻击"也就是使得每两个不在同一行,同一列及同一斜角线.(经典问题 八皇后问题
#include<iostream.h>
#include<math.h>
int sum=0;//用于统计解的个数
int n;//表示皇后的个数
int *x;//解向量
bool place(int k)//判断是否能放置
{ //cout<<"begin place";
for(int j=1;j<k;j++)//若j==k则同行
if(abs(k-j)==abs(x[j]-x[k])||x[j]==x[k])//abs(k-j)==abs(x[j]-x[k])表示在斜对角线
//x[j]==x[k]表示在同一列
return false;
return true;
}
void backtract_queen(int t)
{
if(t>n)
{//一次求解完成,计数器加一,并将该组解输出
sum++;
for(int i=1;i<=n;i++)
cout<<x<<" ";
cout<<endl;
}
else
for(int i=1;i<=n;i++)
{
x[t]=i;
if(place(t)) backtract(t+1);// 递归调用
}
}
void main()
{
cout<<"input the number of queen:";
cin>>n;
x=new int[n];
backtract_queen(1);
cout<<"sum="<<sum<<endl;
cout<<"edn\n";
}
转自百度百科。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值