[算法之回溯算法]

前言:

本篇博客来总结一下回溯算法,作为算法的积累:

核心:

算法定义:

回溯法是一种优先搜索法,按照选优条件深度优先搜索,以达到目标.当搜索到某一步时,发现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术称为回溯法.

算法思想:

回溯法是从初始状态出发,按照深度优先搜索的方式,根据产生子结点的条件约束,搜索问题的解.当发现当前结点不满足求解条件时,就回溯,尝试其他的路径.

回溯法是一种"能进则进,进不了则换,换不了则退"的搜索方法.

解题步骤:

定义解空间

确定解空间的组织结构

搜索解空间

n皇后问题

C++代码


#include "stdafx.h"
#include <iostream>
#include <cmath>   //求绝对值函数需要引入该头文件
#define M 105


using namespace std;


int n;//n表示n个皇后
float x[M];  //x[i]表示第i个皇后放置在第i行第x[i]列
int countn;    //countn表示n皇后问题可行解的个数


bool Place(int t) //判断第t个皇后能否放置在第i个位置
{
    bool ok=true;
    for(int j=1;j<t;j++)   //判断该位置的皇后是否与前面t-1个已经放置的皇后冲突
    {
       if(x[t]==x[j]||t-j==fabs(x[t]-x[j]))//判断列、对角线是否冲突
       {
           ok=false;
           break;
       }
    }
    return ok;
}


void Backtrack(int t)
{
    if(t>n)  //如果当前位置为n,则表示已经找到了问题的一个解
    {
        countn++;
        for(int i=1; i<=n;i++) //打印选择的路径
          cout<<x[i]<<" ";
        cout<<endl;
        cout<<"----------"<<endl;
    }
    else
        for(int i=1;i<=n;i++) //分别判断n个分支,特别注意i不要定义为全局变量,否则递归调用有问题
        {
            x[t]=i;
            if(Place(t))
                Backtrack(t+1); //如果不冲突的话进行下一行的搜索
        }
}
int main()
{
    cout<<"请输入皇后的个数 n:";
    cin>>n;
    countn=0;
    Backtrack(1);
    cout <<"答案的个数是:"<<countn<< endl;
	system("pause");
    return 0;
}

总结:

学习都是从基础开始的,先学好基础,好了,今天就总结到这里了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值