质数方阵

先筛质数

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 vec[11][11][11][11][11];
bitset 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;nb.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;
}

转载于:https://www.cnblogs.com/AH2002/p/9910688.html

你可能感兴趣的:(质数方阵)