终极搜索☞素数方阵

调了也有两三天吧,不说了,直接上代码吧。因为说多了都是泪啊。。反正代码里都有注释
这道题我真的从头彻尾地写了三次,用了三种不同的填数次序来写。第一次50,第二次20,第三次终于A了啊,喜极而泣啊

#include<bits/stdc++.h>
using namespace std;
int sum,a[10][10],now,now1,now2,tot;
int d[4]={1,3,7,9};
bool isprime[1000010];
string ans[1000010];
inline int read()
{
    int num=0,flag=1;
    char c=getchar();
    for (;c<'0'||c>'9';c=getchar())
    if (c=='-') flag=-1;
    for (;c>='0'&&c<='9';c=getchar())
    num=(num<<3)+(num<<1)+c-48;
    return num*flag;
}
void getprime(int x)
{
    memset(isprime,true,sizeof(isprime));
    for (int i=2;i<=x;++i)
    if (isprime[i])
    for (int j=i+i;j<=x;j+=i)
    isprime[j]=false;
}
int main()
{
    sum=read();
    a[1][1]=read();//a[1][1]
    getprime(1000000);
    for (int i1=0;i1<4;++i1)//a[5][5] 
    {
        a[5][5]=d[i1];
        for (int i2=0;i2<=9;++i2)//a[4][4]
        {
            a[4][4]=i2;
            for (int i3=0;i3<=9;++i3)//a[3][3]
            {
                a[3][3]=i3;
                a[2][2]=sum-a[1][1]-a[3][3]-a[4][4]-a[5][5];//a[2][2]
                if (a[2][2]<0) break;
                if (a[2][2]>9) continue;
                now=10000*a[1][1]+1000*a[2][2]+100*a[3][3]+10*a[4][4]+a[5][5];//左上~右下
                if (!isprime[now]) continue;
                for (int i4=0;i4<4;++i4)//a[5][1]
                {
                    a[5][1]=d[i4];
                    for (int i5=0;i5<4;++i5)//a[5][2]
                    {
                        a[5][2]=d[i5];
                        for (int i6=0;i6<4;++i6)//a[5][3]
                        {
                            a[5][3]=d[i6];
                            a[5][4]=sum-a[5][1]-a[5][2]-a[5][3]-a[5][5];//a[5][4]
                            if (a[5][4]<1) break;
                            if (a[5][4]>9) continue;
                            now=10000*a[5][1]+1000*a[5][2]+100*a[5][3]+10*a[5][4]+a[5][5];//第五行
                            if (!isprime[now]) continue;
                            for (int i7=0;i7<4;++i7)//a[1][5]
                            {
                                a[1][5]=d[i7];
                                for (int i8=0;i8<4;++i8)//a[2][5]
                                {
                                    a[2][5]=d[i8];
                                    for (int i9=0;i9<4;++i9)//a[3][5]
                                    {
                                        a[3][5]=d[i9];
                                        a[4][5]=sum-a[1][5]-a[2][5]-a[3][5]-a[5][5];//a[4][5]
                                        if (a[4][5]<1) break;
                                        if (a[4][5]>9) continue;
                                        now=10000*a[1][5]+1000*a[2][5]+100*a[3][5]+10*a[4][5]+a[5][5];//第五列 
                                        if (!isprime[now]) continue;
                                        for (int i10=0;i10<=9;++i10)//a[4][2]
                                        {
                                            a[4][2]=i10;
                                            a[2][4]=sum-a[5][1]-a[4][2]-a[3][3]-a[1][5];//a[2][4]
                                            if (a[2][4]<0) break;
                                            if (a[2][4]>9) continue;
                                            now=10000*a[5][1]+1000*a[4][2]+100*a[3][3]+10*a[2][4]+a[1][5];//左下~右上
                                            if (!isprime[now]) continue;
                                            for (int i11=1;i11<=9;++i11)//a[1][4]
                                            {
                                                a[1][4]=i11;
                                                a[3][4]=sum-a[1][4]-a[2][4]-a[4][4]-a[5][4];//a[3][4]
                                                if (a[3][4]<0) break;
                                                if (a[3][4]>9) continue;
                                                now=10000*a[1][4]+1000*a[2][4]+100*a[3][4]+10*a[4][4]+a[5][4];//第四列 
                                                if (!isprime[now]) continue;
                                                for (int i12=1;i12<=9;++i12)//a[1][3]
                                                {
                                                    a[1][3]=i12;
                                                    a[1][2]=sum-a[1][1]-a[1][3]-a[1][4]-a[1][5];//a[1][2]
                                                    if (a[1][2]<1) break;
                                                    if (a[1][2]>9) continue;
                                                    now=10000*a[1][1]+1000*a[1][2]+100*a[1][3]+10*a[1][4]+a[1][5];//第一行
                                                    if (!isprime[now]) continue;
                                                    a[3][2]=sum-a[1][2]-a[2][2]-a[4][2]-a[5][2];//a[3][2]
                                                    if (a[3][2]>9) break;
                                                    if (a[3][2]<0) continue;
                                                    now=10000*a[1][2]+1000*a[2][2]+100*a[3][2]+10*a[4][2]+a[5][2];//第二列 
                                                    if (!isprime[now]) continue;
                                                    a[3][1]=sum-a[3][2]-a[3][3]-a[3][4]-a[3][5];//a[3][1]
                                                    if (a[3][1]<1) break;
                                                    if (a[3][1]>9) continue;
                                                    now=10000*a[3][1]+1000*a[3][2]+100*a[3][3]+10*a[3][4]+a[3][5];//第三行 
                                                    if (!isprime[now]) continue;
                                                    for (int i13=1;i13<=9;++i13)//a[2][1]
                                                    {
                                                        a[2][1]=i13;
                                                        a[2][3]=sum-a[2][1]-a[2][2]-a[2][4]-a[2][5];//a[2][3]
                                                        a[4][1]=sum-a[1][1]-a[2][1]-a[3][1]-a[5][1];//a[4][1]
                                                        if (a[2][3]<0||a[4][1]<1) break;
                                                        if (a[2][3]>9||a[4][1]>9) continue;
                                                        now1=10000*a[2][1]+1000*a[2][2]+100*a[2][3]+10*a[2][4]+a[2][5];//第二行
                                                        now2=10000*a[1][1]+1000*a[2][1]+100*a[3][1]+10*a[4][1]+a[5][1];//第一列 
                                                        if (!isprime[now1]||!isprime[now2]) continue;
                                                        now1=a[4][1]+a[4][2]+a[4][4]+a[4][5];
                                                        now2=a[1][3]+a[2][3]+a[3][3]+a[5][3];
                                                        if (now1!=now2) continue;
                                                        a[4][3]=sum-now1;//a[4][3]
                                                        if (a[4][3]>9) break;
                                                        if (a[4][3]<0) continue;
                                                        now1=10000*a[4][1]+1000*a[4][2]+100*a[4][3]+10*a[4][4]+a[4][5];//第四行
                                                        now2=10000*a[1][3]+1000*a[2][3]+100*a[3][3]+10*a[4][3]+a[5][3];//第三列
                                                        if (!isprime[now1]||!isprime[now2]) continue;
                                                        tot++;
                                                        for (int i=1;i<=5;++i)
                                                        for (int j=1;j<=5;++j)
                                                        ans[tot]+=a[i][j]+48;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    sort(ans+1,ans+tot+1);
    for (int i=1;i<=tot;++i)
    {
        for (int j=0;j<25;++j)
        {
            printf("%d",ans[i][j]-48);
            if ((j+1)%5==0) printf("\n");
        }
        printf("\n");
    }
    return 0;
}

又臭又长GG

不过AC的那一刹那当然还是很开心的。毕竟终极搜索a
呸 其实就差不多是个暴搜。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值