打表是蜗牛速度吗?
查看原帖
打表是蜗牛速度吗?
658786
STUDENT00楼主2022/11/27 13:15

打表太慢了吧。。。打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;
}
2022/11/27 13:15
加载中...