您的位置:首页 > 其它

终极搜索☞素数方阵

2018-03-11 16:03 295 查看
调了也有两三天吧,不说了,直接上代码吧。因为说多了都是泪啊。。反正代码里都有注释

这道题我真的从头彻尾地写了三次,用了三种不同的填数次序来写。第一次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

呸 其实就差不多是个暴搜。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: