第五第六课------递推+记忆话搜索+搜索八皇后(思想是做梦)+各种剪枝思想
搜索是一个漫长的过程贯彻整个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;
#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;
}
}
;
}
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;
}
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)//请参照兔子定理
最重要的是要自己根据前面与后面的关系(就是前面是怎么从后面来的)
可行性剪纸和最优性剪纸请自学;
原绿色洒满天际