质数方阵

先筛质数

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;
}

猜你喜欢

转载自www.cnblogs.com/mhrlovezmy/p/9910688.html