前言:
本篇博客来总结一下回溯算法,作为算法的积累:
核心:
算法定义:
回溯法是一种优先搜索法,按照选优条件深度优先搜索,以达到目标.当搜索到某一步时,发现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术称为回溯法.
算法思想:
回溯法是从初始状态出发,按照深度优先搜索的方式,根据产生子结点的条件约束,搜索问题的解.当发现当前结点不满足求解条件时,就回溯,尝试其他的路径.
回溯法是一种"能进则进,进不了则换,换不了则退"的搜索方法.
解题步骤:
定义解空间
确定解空间的组织结构
搜索解空间
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; }
总结:
学习都是从基础开始的,先学好基础,好了,今天就总结到这里了!