答案如下,不会可以看看噢!!
2024-08-30 16:30:55
发布于:江苏
#include <cstdio>
#include <cstring>
#include <cstdlib>
int f[11][11];
int n,a[210],t=0;
bool v[210];
bool s[110];
int ans[11][11];
inline void dfs(int x,int y)
{
if(xn+1&&y1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",f[i][j]);
printf("\n");
}
exit(0);//直接结束程序,注意要用<cstdlib>头文件
}
if(x1||y1)
{
for(int i=2;i<=nn;i++)
{
if(s[i])continue;
if((x1&&y!=1&&!v[i+f[x][y-1]])||(x!=1&&y1&&!v[i+f[x-1][y]])||(x!=1&&y!=1&&!v[i+f[x-1][y]]&&!v[i+f[x][y-1]]))//判断相加是否为素数
{
f[x][y]=i;s[i]=true;//标记i出现过
if(y==n)dfs(x+1,1);
else dfs(x,y+1);
f[x][y]=0;s[i]=false;
}
}
}
else
{
for(int i=nn;i>=2;i--)//如果不是第一行或第一列的数那么就让他拿尽量大的数,把小的留给第一行或第一列的位置
{
if(s[i])continue;
if((x1&&y!=1&&!v[i+f[x][y-1]])||(x!=1&&y1&&!v[i+f[x-1][y]])||(x!=1&&y!=1&&!v[i+f[x-1][y]]&&!v[i+f[x][y-1]]))//同上
{
f[x][y]=i;s[i]=true;
if(yn)dfs(x+1,1);
else dfs(x,y+1);
f[x][y]=0;s[i]=false;
}
}
}
}
int main()
{
scanf("%d",&n);
if(n1)
{
printf("NO");
return 0;
}
memset(s,false,sizeof(s));
memset(v,false,sizeof(v));
for(int i=2;i<=nn2;i++)//注意要枚举到n^2的两倍,因为两个数相加很可能大于n
{
if(!v[i])//线性筛素数
{
a[t]=i;
}
for(int j=1;j<=t;j)
{
if(ia[j]>200)break;
v[ia[j]]=true;
if(i%a[j]==0)break;
}
}
memset(f,0,sizeof(f));
f[1][1]=1;s[1]=true;
dfs(1,2);
printf("NO");
return 0;
}
全部评论 1
如果看了有用,麻烦点赞一下。
2024-09-03 来自 江苏
0求求了
2024-09-03 来自 江苏
0
有帮助,赞一个