zoukankan      html  css  js  c++  java
  • 质数方阵

    先筛质数

    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;
    }
    
  • 相关阅读:
    高可用性机制
    Moodle课程资源系统安装
    Windows 10 安装 chocolatey
    centos7安装samba服务器
    抽签网页板代码
    CentOS7系统操作httpd服务
    centos7.2下放行端口
    centos7没有netstat命令的解决办法
    Linux
    Linux下常用服务的端口号超详细整理
  • 原文地址:https://www.cnblogs.com/AH2002/p/9910688.html
Copyright © 2011-2022 走看看