回溯算法是非常经典而且好用的算法,它的主要思想就是把所有情况都列举出来,然后找出符合条件的情况,所以很多复杂的问题都可以用回溯算法解决。
比如说八皇后问题就是经典的回溯算法问题,要把所有情况列出。
我先把回溯的那部分写出来
至于判断条件和main函数就不多说了,直接给上代码
比如说八皇后问题就是经典的回溯算法问题,要把所有情况列出。
我先把回溯的那部分写出来
void backtrack(int counter)
{
int i;
if(counter>8){
sum++;
for(i=1;i<counter;i++){
cout<<x[i];
if(i!=counter){
cout<<" ";
}
}
cout<<endl;
return;
}
else{
for(i=1;i<=8;i++){
x[counter]=i;
if(place(counter)){
backtrack(counter+1);//判断条件是否成立.
}
}
}
}
至于判断条件和main函数就不多说了,直接给上代码
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
static int *x;
static int sum;
static int num;
bool place(int k)
{
int j;
for(j=1;j<k;j++){
if(abs(x[j]-x[k])==abs(j-k) || x[j]==x[k])
return false;
}
return true;
}
void backtrack(int counter)
{
int i;
if(counter>8){
sum++;
for(i=1;i<counter;i++){
cout<<x[i];
if(i!=counter){
cout<<" ";
}
}
cout<<endl;
return;
}
else{
for(i=1;i<=8;i++){
x[counter]=i;
if(place(counter)){
backtrack(counter+1);//判断条件是否成立.
}
}
}
}
int main()
{
num=8;
x=new int[num+1];//为x分配空间.
sum=0;
memset(x,0,sizeof(x));
backtrack(1);
cout<<"共有"<<sum<<"种方案"<<endl;
}