一种回溯的模板
i=1;a[i]=1;
while(1){
g=1; //作为满足不满足约束条件的标记
for(int k=i-1;k>=1;k--)
if(约束条件一) g=0; //不满足约束条件则返回
if(g&&约束条件二) sum++;//解+1
if(g&&i<n) {i++; a[i]=取值点;continue; }
while(a[i]==回溯点&&i>1) i--; //向前回溯
if(a[i]==n&&i==1) break;
else a[i]=a[i]+1;
}
//一道例题
在国际象棋上摆放四个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。(四皇后问题)
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main()
{
int a[5];
int g,i=1,sum=0;
a[i]=1;
while(1)
{
g=1;
for(int k=i-1;k>=1;k--)
if(a[i]==a[k]||abs(a[i]-a[k])==(i-k))//约束条件一
g=0;
if(g&&i==4) sum++;//约束条件二
if(g&&i<4) {i++; a[i]=1;continue; }
while(a[i]==4&&i>1) i--;//向前回溯
if(a[i]==4&&i==1) break;
else a[i]=a[i]+1;
}
cout<<sum<<endl;
return 0;
}