1. 程式人生 > >第五第六課------遞推+記憶話搜尋+搜尋八皇后(思想是做夢)+各種剪枝思想

第五第六課------遞推+記憶話搜尋+搜尋八皇后(思想是做夢)+各種剪枝思想

搜尋是一個漫長的過程貫徹整個oi;

八皇后-------

#include <bits/stdc++.h>
#define inf 0x7f
using namespace std;
int n,ans,a[inf],b[inf],c[inf],d[inf];
void print(){
 ++ans;
 if(ans<=3){
 for(int i=1;i<=n;i++) cout<<d[i]<<" ";
 cout<<endl;
 }

void s(int k){//行
for(int i=1;i<=n;i++){//列舉每一列
if(a[i]==0&&b[k-i+n]==0&&c[i+k]==0){
  d[k]=i;
  a[i]=1;
 b[k-i+n]=1;
 c[i+k]=1;  if(i==n) print();
 else s(k+1);
 b[k-i+n]=0;
 c[i+k]=0;
 a[i]=0;
}
 }
 ;
}
  int main(){
cin>>n;
s(1);
cout<<ans;
return 0;
} 上述程式碼是有問題的,目前還未找出; 遞推講了基本的 卡特蘭數是 an=an-1+2(n-1),具體請見課件 第二類斯特林數  】n個有區別的球放到m個相同的盒子中,要求無一空 盒,其不同的方案數用S(n,m)表示,稱為第二類Stirling數。  S2(n,m)=mS2(n-1,m)+S2(n-1,m-1)   (n>1,m1)要麼將n-1個球放進所有盒子裡其中最後一個球可以放進任意一個,另外一個就是隻把一個球放在盒子裡; 斐波拉契 f(n)=f(n-1)+f(n-1)//請參照兔子定理 最重要的是要自己根據前面與後面的關係(就是前面是怎麼從後面來的)
可行性剪紙和最優性剪紙請自學;