前言:

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

核心:

算法定义:

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

算法思想:

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

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

解题步骤:

定义解空间

确定解空间的组织结构

搜索解空间

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; }


总结:

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