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;
}

愿各位能活着看到这

(阿门)

转载于:https://www.cnblogs.com/tktp-ht/p/10729121.html

loj.ac:#10024. 「一本通 1.3 练习 3」质数方阵相关推荐

  1. 「一本通 6.5 练习 3」迷路

    「一本通 6.5 练习 3」迷路 题目描述 大意说一个给你有向图, 一个有n个节点,每个节点相连的边为所需要花费的时间, 问你从1到n 在时间刚好为t是的方案数.输出%2009 注意:不能在某个节点逗 ...

  2. 【C++】「一本通 1.1 例 4」加工生产调度

    「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...

  3. LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】

    10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...

  4. #10016. 「一本通 1.2 练习 3」灯泡(三分)

    参考博客链接:「一本通 1.2 练习 3」灯泡(三分) #include<stdio.h> #include<string.h> #include<math.h> ...

  5. 【C++】「一本通 1.1 例 2」种树

    「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...

  6. #10001. 「一本通 1.1 例 2」种树

    #10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...

  7. 【C++】「一本通 1.1 例 5」智力大冲浪

    「一本通 1.1 例 5」智力大冲浪 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1426 LibreOJ- ...

  8. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  9. LOJ#10172. 「一本通 5.4 练习 1」涂抹果酱

    题目链接:https://loj.ac/problem/10172 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×MN×MN×M 的矩形,它被划分成 ...

最新文章

  1. AutowireCapableBeanFactory,实现不必配置xml文件,动态加载bean
  2. 第九章 关联数组/哈希表
  3. mediawiki常用设置
  4. 同一页面引入多个JS文件的编码问题
  5. Linux(centos7.4)上FTP服务器搭建(使用yum)
  6. Git:git pull 的使用
  7. ARDUINO LCD显示简单的汉字、符号(保姆级教程!)
  8. 【MATLAB教程案例29】基于Baker映射和Logistic混沌序列的图像加解密matlab实现
  9. MV* 模式梳理与理解(还原真实的 MV* 模式)
  10. Unity3D在windows10下小问题解决
  11. # PPT进阶——文字环绕
  12. 网易考拉在服务化改造方面的实践
  13. Android 手机模拟游戏手柄(USB,C#,winio)
  14. 算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)
  15. 盲目入手餐饮业并不可取,三思而后行极为关键
  16. 离散事件动态系统 #Petri网作业 #可达图 #赋时Petri
  17. Angular 4 Http
  18. Impala/Hive现状分析与前景展望
  19. [Java]JavaWeb学习笔记(动力节点老杜2022)【Javaweb+MVC架构模式完结】
  20. java中new的含义如何理解?

热门文章

  1. v$sysstat表解释
  2. C#,silverlight中 将颜色字符串的RRGGBB转换成为颜色
  3. 107.网络服务质量包括哪些(QoS)
  4. Qt编程之QTreeWidget使用方法
  5. Qt DOM读写XML文件
  6. 如何清除windows安全中心病毒和威胁防护的保护历史记录
  7. 美国波特兰市禁用人脸识别,被违规监控可获赔1000美元
  8. 人工智能伦理体系:基础架构与关键问题
  9. 零基础Python学习路线图,小白的进阶之路!
  10. linux vim编辑文本是 m,linux基础命令介绍四:文本编辑 vim