质数方阵

先筛质数

vector存满足某种状态且各数位和合法的质数

然后先填第一行、第一列、第一对角线

继续填,先填约束多的,再填约束少的

复杂度非常可观就是代码有点长

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
#include"vector"
#include"bitset"
using namespace std;

const int MAXN=1e5+5;

int sum,c,cnt;
int pw[5],p[MAXN];
vector<int> vec[11][11][11][11][11];
bitset<MAXN> vis;
struct rpg{
	int v[6][6];
	
	void write()
	{
		for(int i=1;i<=5;++i){
			for(int j=1;j<=5;++j){
				printf("%d",v[i][j]);
			}puts("");
		}return;
	}
}b,a[505];

int get(int x,int v){return x/pw[v-1]%10;}
void init()
{
	scanf("%d%d",&sum,&c);pw[0]=1;for(int i=1;i<=4;++i) pw[i]=pw[i-1]*10;
	for(int i=2;i<=1e5;++i){
		if(!vis[i]) p[++p[0]]=i;
		for(int j=1;j<=p[0]&&i*p[j]<=1e5;++j){
			vis[i*p[j]]=1;
			if(!(i%p[j])) break;
		}
	}for(int i=1;i<=p[0];++i){
		if(p[i]<1e4) continue;
		int tmp1=get(p[i],5),tmp2=get(p[i],4),tmp3=get(p[i],3),tmp4=get(p[i],2),tmp5=get(p[i],1);
		if(tmp1+tmp2+tmp3+tmp4+tmp5!=sum) continue;
		vec[tmp1][tmp2][tmp3][tmp4][tmp5].push_back(p[i]);
	}for(int i=1;i<=9;++i){
		for(int j=0;j<=9;++j){
			for(int k=0;k<=9;++k){
				for(int l=0;l<=9;++l){
					for(int m=1;m<=9;m+=2){
						for(int n=0;n<vec[i][j][k][l][m].size();++n){
							int tmp=vec[i][j][k][l][m][n];
							vec[i][j][k][l][10].push_back(tmp);
							vec[i][j][k][10][m].push_back(tmp);
							vec[i][j][10][l][m].push_back(tmp);
							vec[i][10][k][l][m].push_back(tmp);
							vec[10][j][k][l][m].push_back(tmp);
							vec[i][j][k][10][10].push_back(tmp);
							vec[i][j][10][l][10].push_back(tmp);
							vec[i][10][k][l][10].push_back(tmp);
							vec[10][j][k][l][10].push_back(tmp);
							vec[i][j][10][10][m].push_back(tmp);
							vec[i][10][k][10][m].push_back(tmp);
							vec[10][j][k][10][m].push_back(tmp);
							vec[i][10][10][l][m].push_back(tmp);
							vec[10][j][10][l][m].push_back(tmp);
							vec[10][10][k][l][m].push_back(tmp);
							vec[i][j][10][10][10].push_back(tmp);
							vec[i][10][k][10][10].push_back(tmp);
							vec[10][j][k][10][10].push_back(tmp);
							vec[i][10][10][l][10].push_back(tmp);
							vec[10][j][10][l][10].push_back(tmp);
							vec[10][10][k][l][10].push_back(tmp);
							vec[i][10][10][10][m].push_back(tmp);
							vec[10][j][10][10][m].push_back(tmp);
							vec[10][10][k][10][m].push_back(tmp);
							vec[10][10][10][l][m].push_back(tmp);
							vec[i][10][10][10][10].push_back(tmp);
							vec[10][j][10][10][10].push_back(tmp);
							vec[10][10][k][10][10].push_back(tmp);
							vec[10][10][10][l][10].push_back(tmp);
							vec[10][10][10][10][m].push_back(tmp);
							vec[10][10][10][10][10].push_back(tmp);
						}
					}
				}
			}
		}
	}return;
}

void solve()
{
	for(int i=0;i<vec[c][10][10][10][10].size();++i){//第一行 
		for(int j=1;j<=5;++j) b.v[1][j]=get(vec[c][10][10][10][10][i],6-j);
		for(int j=0;j<vec[c][10][10][10][10].size();++j){//第一列 
			for(int k=1;k<=5;++k) b.v[k][1]=get(vec[c][10][10][10][10][j],6-k);
			for(int k=0;k<vec[c][10][10][10][10].size();++k){//左上右下对角线 
				for(int l=1;l<=5;++l) b.v[l][l]=get(vec[c][10][10][10][10][k],6-l);
				for(int l=0;l<vec[b.v[5][1]][10][b.v[3][3]][10][b.v[1][5]].size();++l){//左下右上对角线 
					b.v[4][2]=get(vec[b.v[5][1]][10][b.v[3][3]][10][b.v[1][5]][l],4);
					b.v[2][4]=get(vec[b.v[5][1]][10][b.v[3][3]][10][b.v[1][5]][l],2);
					for(int m=0;m<vec[b.v[2][1]][b.v[2][2]][10][b.v[2][4]][10].size();++m){//第二行 
						b.v[2][3]=get(vec[b.v[2][1]][b.v[2][2]][10][b.v[2][4]][10][m],3);
						b.v[2][5]=get(vec[b.v[2][1]][b.v[2][2]][10][b.v[2][4]][10][m],1);
						for(int n=0;n<vec[b.v[1][5]][b.v[2][5]][10][10][b.v[5][5]].size();++n){//第五列 
							b.v[3][5]=get(vec[b.v[1][5]][b.v[2][5]][10][10][b.v[5][5]][n],3);
							b.v[4][5]=get(vec[b.v[1][5]][b.v[2][5]][10][10][b.v[5][5]][n],2);
							for(int o=0;o<vec[b.v[4][1]][b.v[4][2]][10][b.v[4][4]][b.v[4][5]].size();++o){//第四行 
								b.v[4][3]=get(vec[b.v[4][1]][b.v[4][2]][10][b.v[4][4]][b.v[4][5]][o],3);
								for(int p=0;p<vec[b.v[1][3]][b.v[2][3]][b.v[3][3]][b.v[4][3]][10].size();++p){//第三列 
									b.v[5][3]=get(vec[b.v[1][3]][b.v[2][3]][b.v[3][3]][b.v[4][3]][10][p],1);
									for(int q=0;q<vec[b.v[3][1]][10][b.v[3][3]][10][b.v[3][5]].size();++q){//第三行 
										b.v[3][2]=get(vec[b.v[3][1]][10][b.v[3][3]][10][b.v[3][5]][q],4);
										b.v[3][4]=get(vec[b.v[3][1]][10][b.v[3][3]][10][b.v[3][5]][q],2);
										for(int r=0;r<vec[b.v[1][2]][b.v[2][2]][b.v[3][2]][b.v[4][2]][10].size();++r){//第二列 
											b.v[5][2]=get(vec[b.v[1][2]][b.v[2][2]][b.v[3][2]][b.v[4][2]][10][r],1);
											for(int s=0;s<vec[b.v[1][4]][b.v[2][4]][b.v[3][4]][b.v[4][4]][10].size();++s){//第四列 
												b.v[5][4]=get(vec[b.v[1][4]][b.v[2][4]][b.v[3][4]][b.v[4][4]][10][s],1);
												for(int t=0;t<vec[b.v[5][1]][b.v[5][2]][b.v[5][3]][b.v[5][4]][b.v[5][5]].size();++t){//第五行 
													a[++cnt]=b;
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}return;
}

bool cmp(rpg a,rpg b)
{
	for(int i=1;i<=5;++i){
		for(int j=1;j<=5;++j){
			if(a.v[i][j]<b.v[i][j]) return 1;
			if(a.v[i][j]>b.v[i][j]) return 0;
		}
	}return 0;
}

void write()
{
	if(!cnt){puts("NONE");return;}
	sort(a+1,a+cnt+1,cmp);a[1].write();
	for(int i=2;i<=cnt;++i) puts(""),a[i].write();
	return;
}

int main()
{
	init();
	solve();
	write();
	return 0;
}
posted @ 2018-11-05 18:27  A·H  阅读(453)  评论(0编辑  收藏  举报