打表太慢了吧。。。打25打了30min。。。有没有哪位大佬帮忙优化优化?
#include<bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
int n,ans;
vector<vector<int> > a,b,c;
set<vector<vector<int> > > s;
void put(){
for(int i=2;i<=n;i++){
for(int j=1;j<=n;j++) a[i][j]=a[i-1][j]/a[i-1][j-1]/a[i-1][j+1]/a[i-2][j];
}
}
bool check(){
for(int i=1;i<=n;i++){
if(a[n-1][i]*a[n][i-1]*a[n][i+1]!=a[n][i]) return 0;
}
return 1;
}
bool f1(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) c[i][j]=b[i][n-j+1];
}
return s.count(c);
}
bool f2(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) c[i][j]=b[n-i+1][j];
}
return s.count(c);
}
bool f(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) b[i][j]=a[i][j];
}
for(int p=1;p<=4;p++){
if(s.count(b)||f1()||f2()) return 0;
int ss=0;
for(int j=1;j<=n;j++){
for(int i=n;i>=1;i--){
ss++;
c[(ss-1)/n+1][(ss-1)%n+1]=b[i][j];
}
}
swap(b,c);
}
return 1;
}
void dfs(int now){
if(now>n){
put();
if(f()&&check()){
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=a[i][j];
s.insert(b);
ans++;
}
return;
}
a[1][now]=1;
dfs(now+1);
a[1][now]=-1;
dfs(now+1);
}
int work(){
s.clear();
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++) a[i][j]=1;
}
ans=0;
dfs(1);
return ans;
}
int main(){
for(int i=0;i<=31;i++){
vector<int> empty;
for(int j=0;j<=31;j++) empty.push_back(0);
a.push_back(empty);
b.push_back(empty);
c.push_back(empty);
}
printf("a[]={0");
for(n=1;n<=30;n++) printf(",%d",work());
printf("}");
return 0;
}