四阶幻方c语言编程,13年 第四届 蓝桥杯C语言C组 第4题 幻方填空
标题: 幻方填空
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
思路:接着振兴中华的思路,从(0,0)的位置开始走,走到(3,3)是结束。在走的过程中不是统计,从起点走到终点有多少种走法。而是判断这个非数值的位置上(? *),放非图片中出现的数字,能不能满足题意。即每行每列每条对角线上的值都相等。
当dfs从(0,0)走到(3,3),过程中不在图片的中存在的1----16的数字已经填了上去,走到结尾的时候,就要测试是否满足题意,满足就输出。
dfs是一个试探的过程,这个方法行不行,不行就再换一种方法,直到当某一种解法存在且满足题意的时候,程序的使命,也就完成了。
过程:起始位置到终点dfs-->过程中在非数字位置上放数字-->放的这些数字是不重复的且满足在1--16中且不是图片上出现的数字-->走到结尾的时候检查放的这些数字是否满足题意-->满足题意就输出-->程序结束。
#include
#include
int a[4][4]= {16,0,0,13,0,0,11,0,9,0,0,0,0,15,0,1}; //如图所示幻方数据
int b[10]= {2,3,4,5,6,7,8,10,12,14}; //图片中没有的数字。
int c[10]= {0}; //做标记,这个数用了就在对应的位置上标记为1。
int ce() { //检查每行每列每条对角线的值是否相同。
int i,j;
int sum1=0,sum2=0;
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
sum1+=a[i][j];
sum2+=a[j][i];
}
if(sum1!=34||sum2!=34) {
return 0;
}
sum1=0;
sum2=0;
}
for(i=0; i<4; i++) {
sum1+=a[i][i];
}
for(i=0,j=3; i<4&&j>=0; i++,j--) {
sum2+=a[i][j];
}
if(sum1!=34||sum2!=34) {
return 0;
}
return 1;
}
void print() { //输出函数。
int i,j;
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
printf("%3d ",a[i][j]);
}
printf("\n");
}
printf("\n");
}
void dfs(int x,int y) {
int i;
if(x==4) { //结尾,因为搜索的过程是从左到右,再到下一行,是通过一个小技巧完成的。当x=3的时候是第四行,第四行搜索完成到了第五行(x=4)就结束,前四行都走完了。走到头了。
if(ce()) {
print();
exit(0);
}
return ;
}
if(a[x][y]==0) { //将问号 星号 设置为0 便于搜索 是零就是说应该填数的。
for(i=0; i<10; i++) { //将b数组中i位置上的数,放在a[x][y]内,循环进行十次, a[x][y]==0这个位置上放十个数都放一边,所有的 a[x][y]==0都将b数组里面的数放过来一遍 历遍。
if(x==1&&a[0][0]+a[0][1]+a[0][2]+a[0][3]!=34)return ; //当x=1的时候,第一行已经都有数字了,判断这些数字是否等于三十四,从1加到16除以4等于34,不等于三十四就结束这个可能,因为这个可能肯定不满足题意。
if(x==2&&a[1][0]+a[1][1]+a[1][2]+a[1][3]!=34)return ;
if(x==3&&a[2][0]+a[2][1]+a[2][2]+a[2][3]!=34)return ;
if(!c[i]) { //选中b[i]这个位置,之后c[i]=1就是表明这个位置的数字已经使用过了,不能再用。
c[i]=1;
a[x][y]=b[i]; //把b[i]的上的数字放在这个a[x][y]上。
dfs(x+(y+1)/4,(y+1)%4); //小技巧,举几个示例 (3,2) (2,2) 套这个公式,推推是等价的。
c[i]=0;//这个可能已经尝试过了,进行下一种可能,在进行在一种可能的时候,要把数据还原到未使用之前。
a[x][y]=0;
}
}
}
else
{
dfs(x+(y+1)/4,(y+1)%4); //图片上有数字,直接走过去。
}
}
int main() {
dfs(0,0); //深度优先搜索,起始位置。
return 0;
}
四阶幻方c语言编程,13年 第四届 蓝桥杯C语言C组 第4题 幻方填空相关推荐
- 金蝉素数c语言,算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
前言:以下代码仅供参考,若有错误欢迎指正哦~ 1好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但 ...
- 标题 错误票据c语言,内含答案的 -- 2013蓝桥杯C语言本科组B.doc
内含答案的 -- 2013蓝桥杯C语言本科组B.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们 ...
- 【解题报告+通法】_九宫幻方 蓝桥杯 2017年C组第八题(dfs解法)
题目描述 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. 三阶幻方又被 ...
- 2013第四届蓝桥杯C/C++ B组省赛
第一题 题目标题: 高斯日记大数学家高斯有个好习惯:无论如何都要记日记.他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高 ...
- 2013年第四届蓝桥杯C/C++B组省赛题目及答案 1
一.高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的 ...
- 3a三次方h c语言表达式,希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题...
原创 标题:希尔伯特曲线 希尔伯特曲线是以下一系列分形曲线 Hn 的极限.我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和 ...
- 第四届蓝桥杯省赛javaB组试题解析
1.标题: 世纪末的星期曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破.还有人称今后的某个世纪末的12月31日,如果是星期一则会....有趣的是,任何一个世纪末的年份的12月31日 ...
- 2013年第四届蓝桥杯C/C++ A组国赛 —— 第五题:网络寻路
标题:网络寻路 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少 ...
- 2013年第四届蓝桥杯C/C++ A组国赛 —— 第四题:约数倍数选卡片
标题:约数倍数选卡片 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字 ...
最新文章
- 设计模式 之美 -- 工厂方法模式
- Apache Tomcat/7.0.47
- Redis进阶实践之十六 Redis大批量增加数据
- c# datetime._C#| DateTime.Year属性与示例
- 关于RUP的一点见解,针对于近期的面向对象方法课程
- jaxen.jar下载地址
- 打开计算机硬盘有声音,电脑硬盘有响声总吱吱响的解决方法
- 【电路设计】尖峰电压与浪涌电流
- java获取docx_java使用poi读取doc和docx文件的实现示例
- 英语听力采用计算机化考试,高考英语听力机考12问——访北京教育考试院有关负责人...
- 最短路径算法 | Bellman-Ford Algorithm
- Spring Security登录成功后重定向到登陆前页面 解决方案
- 如何升级MacOS自带的PHP到指定版本(5.3-7.3)
- 中国科学院大学计算机考研好考吗,中国科学院大学考研难吗?一般要什么水平才可以进入?...
- CodeForces - 332B Maximum Absurdity 前缀和
- Error creating bean with name ‘endpoint‘ defined in class path resource [.../CxfConfig.class]
- Android Studio打包APK安装失败:应用是非正式版本,当前设备不支持安装
- Java和开源GIS平台
- 三网合一我们该做些什么?
- c语言程序设计项目实训总结,c语言程序设计实训总结.docx
热门文章
- 2.5维电子地图关键技术研究与实现
- IDEA改变文件夹显示方式
- linux C语言多线程 轻进程 LWP:Light Weight Process
- 都市丽人“正青年”设计大赛结果出炉 感召中国新生设计力量
- 使用TextPaint实现自由加粗字体:BoldTextView,支持中粗
- 【土旦】在vue filters中 优雅的使用对象的key、value来替换 if switch多重判断简化流程...
- (转)程序员键盘推荐
- 【报告分享】2021母婴行业白皮书-巨量引擎(附下载)
- Trainning 1 DAY
- 来自Java程序员的Python新手入门小结