CSDN的博客

友键

题目描述

质数方阵是一个\(5×5\)的方阵,每行、每列、两条对角线上的数字可以看作是五位的素数。方格中的行按照从左到右的顺序组成一个素数,而列按照从上到下的顺序。两条对角线也是按照从左到右的顺序来组成。这些素数每一位上的数之和必须相等。 左上角的数字是预先定好的。 一个素数可能在方阵中重复多次。不计含有前导 \(0\) 的五位素数,如\(00003\) 不是五位素数。



给出每一位上的数之和,以及左上角的数字,请输出方阵所有可能的填数方案。

如果不只有一个解,将它们全部输出(按照这 \(25\) 个数字组成的 \(25\) 位数的大小排序)。

输入格式

一行,包括两个被空格分开的整数:每一位上的数之和,以及左上角的数字。

输出格式

对于每一个找到的方案输出 \(5\) 行,每行 \(5\) 个字符,每行可以转化为一个 \(5\) 位的质数。在两组方案中间输出一个空行。如果没有解就单独输出一行 \(NONE\)。

样例

样例输入

11 1

样例输出

11351

14033

30323

53201

13313

11351

33203

30323

14033

33311

13313

13043

32303

50231

13331


不怎么华丽的分割线

这道题是真的水难,暴力中还带着技巧。

总的来说,我的填写方法有点奇特



填写顺序常奇特

这样填是我随便想的,结果过了 (除先填左上到右下)

代码很丑,照着填写顺序思路,代码写的很通俗,只要你不被判断绕晕

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int map[10][10];
}ans[110000];
bool cmp(node a,node b)
{
for(int i=0;i<=4;i++)for(int j=0;j<=4;j++)if (a.map[i][j]!=b.map[i][j])return a.map[i][j]<b.map[i][j];
}
int a[10][10],n,k;
bool b[110000];
void bt()
{
k++;for(int i=0;i<=4;i++)for(int j=0;j<=4;j++)ans[k].map[i][j]=a[i][j];
}
void dfs6()
{
for(int i=1;i<=9;i++)
if(a[0][0]+a[0][4]+i<=n&&a[1][1]+a[2][1]+a[3][1]+i<n&&n-i-a[1][1]-a[2][1]-a[3][1]<=9&&!b[i*10000+a[1][1]*1000+a[2][1]*100+a[3][1]*10+n-i-a[1][1]-a[2][1]-a[3][1]])
{
a[0][1]=i,a[4][1]=n-i-a[1][1]-a[2][1]-a[3][1];
for(int j=1;j<=9;j++)
if (a[0][0]+a[0][1]+j+a[0][4]<n&&n-j-a[1][2]-a[2][2]-a[3][2]<=9&&j+a[1][2]+a[2][2]+a[3][2]<n&&n-a[0][0]-a[0][1]-j-a[0][4]<=9&&!b[j*10000+a[1][2]*1000+a[2][2]*100+a[3][2]*10+n-j-a[1][2]-a[2][2]-a[3][2]]&&!b[a[0][0]*10000+a[0][1]*1000+j*100+(n-a[0][0]-a[0][1]-j-a[0][4])*10+a[0][4]])
{
int n42=n-j-a[1][2]-a[2][2]-a[3][2],n03=n-a[0][0]-a[0][1]-j-a[0][4];
if(a[4][0]+a[4][1]+n42+a[4][4]<=n&&n-a[4][0]-a[4][1]-n42-a[4][4]<=9&&n03+a[1][3]+a[2][3]+a[3][3]<=n&&n-n03-a[1][3]-a[2][3]-a[3][3]<=9&&!b[a[4][0]*10000+a[4][1]*1000+n42*100+(n-a[4][0]-a[4][1]-n42-a[4][4])*10+a[4][4]]&&!b[n03*10000+a[1][3]*1000+a[2][3]*100+a[3][3]*10+n-n03-a[1][3]-a[2][3]-a[3][3]])
{
a[0][2]=j,a[4][2]=n42,a[0][3]=n03,a[4][3]=n-a[4][0]-a[4][1]-n42-a[4][4];
bt();
a[0][2]=a[4][2]=a[0][3]=a[4][3]=0;
}
}
a[0][1]=a[4][1]=0;
}
}
void dfs5()
{
for(int i=1;i<=9;i++)
if(a[3][3]+i<=n&&a[0][0]+a[1][0]+a[2][0]+i<n&&n-a[0][0]-a[1][0]-a[2][0]-i<=9&&!b[a[0][0]*10000+a[1][0]*1000+a[2][0]*100+i*10+n-a[0][0]-a[1][0]-a[2][0]-i])
{
a[3][0]=i,a[4][0]=n-a[0][0]-a[1][0]-a[2][0]-i;
for(int j=0;j<=9;j++)
if(a[1][1]+a[2][1]+j<=n&&a[3][0]+a[3][3]+j<=n&&a[4][0]+a[2][2]+a[1][3]+j<n&&n-a[4][0]-j-a[2][2]-a[1][3]<=9&&!b[a[4][0]*10000+j*1000+a[2][2]*100+a[1][3]*10+n-a[4][0]-j-a[2][2]-a[1][3]])
{
int n04=n-a[4][0]-j-a[2][2]-a[1][3];
if(n04+a[1][4]+a[2][4]+a[4][4]<=n&&n-n04-a[1][4]-a[2][4]-a[4][4]<=9&&!b[n04*10000+a[1][4]*1000+a[2][4]*100+(n-n04-a[1][4]-a[2][4]-a[4][4])*10+a[4][4]])
{
int n34=n-n04-a[1][4]-a[2][4]-a[4][4];
if(a[3][0]+j+a[3][3]+n34<=n&&n-a[3][0]-j-a[3][3]-n34<=9&&!b[a[3][0]*10000+j*1000+(n-a[3][0]-j-a[3][3]-n34)*100+a[3][3]*10+n34])
{
a[3][1]=j,a[0][4]=n04,a[3][4]=n34,a[3][2]=n-a[3][0]-j-a[3][3]-n34;
dfs6();
a[3][1]=a[0][4]=a[3][4]=a[3][2]=0;
}
}
}
a[3][0]=a[4][0]=0;
}
}
void dfs4()
{
for(int i=0;i<=9;i++)
if(a[1][1]+i<=n&&a[2][0]+a[2][2]+i<=n)
{
a[2][1]=i;
for(int j=0;j<=9;j++)
if(a[1][3]+j<=n&&a[2][0]+a[2][1]+a[2][2]+j<n&&n-a[2][0]-a[2][1]-a[2][2]-j<=9&&!b[a[2][0]*10000+a[2][1]*1000+a[2][2]*100+j*10+n-a[2][0]-a[2][1]-a[2][2]-j])
{
a[2][3]=j,a[2][4]=n-a[2][0]-a[2][1]-a[2][2]-j;
dfs5();
a[2][3]=a[2][4]=0;
}
a[2][1]=0;
}
}
void dfs3()
{
for(int i=0;i<=9;i++)
if(a[1][0]+a[1][1]+a[1][2]+i<n&&n-a[1][0]-a[1][1]-a[1][2]-i<=9&&a[3][3]+i<=n&&!b[a[1][0]*10000+a[1][1]*1000+a[1][2]*100+i*10+n-a[1][0]-a[1][1]-a[1][2]-i])
{
a[1][3]=i,a[1][4]=n-a[1][0]-a[1][1]-a[1][2]-i;
for(int j=1;j<=9;j++)
if(a[0][0]+a[1][0]+j<=n&&a[2][2]+j<=n)
{
a[2][0]=j;
dfs4();
a[2][0]=0;
}
a[1][3]=a[1][4]=0;
}
}
void dfs2()
{
for(int i=1;i<=9;i++)
if(a[0][0]+i<=n&&a[1][1]+i<=n)
{
a[1][0]=i;
for(int j=0;j<=9;j++)
if(a[1][0]+a[1][1]+j<=n&&a[2][2]+j<=n)
{
a[1][2]=j;
dfs3();
a[1][2]=0;
}
a[1][0]=0;
}
}
void dfs1()
{
for(int i=0;i<=9;i++)
if(a[0][0]+i<=n)
{
a[1][1]=i;
for(int j=0;j<=9;j++)
if(a[0][0]+a[1][1]+j<=n)
{
a[2][2]=j;
for(int g=0;g<=9;g++)
if(a[0][0]+a[1][1]+a[2][2]+g<=n&&n-a[0][0]-a[1][1]-a[2][2]-g<=9&&!b[a[0][0]*10000+a[1][1]*1000+a[2][2]*100+g*10+n-a[0][0]-a[1][1]-a[2][2]-g])
{
a[3][3]=g,a[4][4]=n-a[0][0]-a[1][1]-a[2][2]-g;
dfs2();
a[3][3]=a[4][4]=0;
}
a[2][2]=0;
}
a[1][1]=0;
}
}
int prime[110000],pr=0;
int main()
{
scanf("%d%d",&n,&a[0][0]);//
memset(prime,0,sizeof(prime));
memset(b,false,sizeof(b));
for(int i=2;i<=100000;i++)
{
if(b[i]==false)
{
prime[++pr]=i;
}
for(int j=1;(j<=pr)&& (i*prime[j]<=100000);j++)
{
b[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
dfs1();
if(!k)printf("NONE\n");
else
{
sort(ans+1,ans+k+1,cmp);
for(int l=1;l<=k;l++)
{
for(int i=0;i<=4;i++)
{
for(int j=0;j<=4;j++)printf("%d",ans[l].map[i][j]);
printf("\n");
}
printf("\n");
}
}
return 0;
}

愿各位能活着看到这

(阿门)

loj.ac:#10024. 「一本通 1.3 练习 3」质数方阵的更多相关文章

  1. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  2. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...

  3. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  4. 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie

    #10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...

  5. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  6. 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map

    题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...

  7. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  8. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...

  9. #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ

    题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...

随机推荐

  1. linux 定时任务,压缩 日志,并删除掉 指定日期之前的 日志

    sh文件 #!/bin/sh myPath="/var/www/Client/storage/logs/" myFile="lumen.log" cd $myP ...

  2. vue 异步刷新页面,

    入口文件vue.app中 <div id="app"> <router-view v-if="isRouterAlive" /> < ...

  3. Vue-Router路由 Vue-CLI脚手架和模块化开发 之 使用路由对象获取参数

    使用路由对象$route获取参数: 1.params: 参数获取:使用$route.params获取参数: 参数传递: URL传参:例 <route-linke to : "/food ...

  4. windows下共享文件夹在Linux下打开

    ①首先在Windows下创建一个准备用来共享用的文件夹 ②在虚拟机下选择第一步创建的文件夹为共享文件夹 ③在虚拟机shell命令框下输入 cd  /mnt/sgfs 回车进入共享文件夹. 备注:其他细 ...

  5. 利用JS模拟排队系统

    我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天给大家分享的是js模拟排队系统,刚开始有排队序列,序列里有vip用户和普通用户,vip用户永远位于普通用户的前面,只有当当前vip用户都办理 ...

  6. VS2010下安装boost库

    在我们的C++项目中安装boost库,下面以VS2010版本作为例子,其它版本的设置也差不多. 一.编译生成boost库 1.下载最新的boost(本人下载的是boost_1_56_0).boost官 ...

  7. pat1003 迪杰斯特拉法和dfs求最短路

    本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解  是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #includ ...

  8. Manjaro 安装svn客户端,以及checkout使用命令

    安装svn sudo pacman -S svn checkout操作指令 svn co http://xxxxxxx /home/xx update 更新版本 svn up [文件/目录] 直接使用 ...

  9. 最短Hamilton路径【状压DP】

    给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 ...

  10. dao层、service和action的运用和区别

    DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,对于数据库的操作,具体到对于某个表的增删改查, 也就是说某个DAO一定是和数据库的某一张表一一对应的 ...