标题:六角幻方

把 1 2 3 ... 19 共19个整数排列成六角形状,如下:

* * *
   * * * *
  * * * * *
   * * * * 
    * * *

要求每个直线上的数字之和必须相等。共有15条直线哦!

再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。

请你填写出中间一行的5个数字。数字间用空格分开。

这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)

解题报告:

好久没写搜索了,,当个练习。

不难发现每一行的值的和应该是38,所以我们已经有了三个已知数字了。

根据对称性把这三个数放在每一行的开始,相当于有了三个已知行的行首,然后按行dfs,同时判断是否凑够了38,如果超了38那就直接return就行,这一点可以用附初始值为比较大的值(这里用了100000)来实现。如果还没填满这一行但是和已经大于38了  或者  都填满了并且还不是38,那就return。这应该是最优秀的剪枝了,是每一步都会有剪枝。当然如果不这样剪枝,而是直接: 每一行都填满了再判断是否等于38,也可以。

最终答案:

10 12 16
13 4 2 19
15 8 5 7 3
14 6 1 17
9 11 18

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int a[55][55],all[55] = {0,10,13,15,0,0};
int up[55] = {0,3,4,5,4,3};
bool vis[55],ok[55][55];
bool cc() {if(a[1][2]+a[2][2]+a[3][2]+a[4][1]!=38) return 0;if(a[1][3]+a[2][3]+a[3][3]+a[4][2]+a[5][1]!=38) return 0;if(a[2][4]+a[3][4]+a[4][3]+a[5][2]!=38) return 0;if(a[3][5]+a[4][4]+a[5][3]!=38) return 0;if(a[1][3]+a[2][4]+a[3][5]!=38) return 0;if(a[1][2]+a[2][3]+a[3][4]+a[4][4]!=38) return 0;if(a[1][1]+a[2][2]+a[3][3]+a[4][3]+a[5][3]!=38) return 0;if(a[2][1]+a[3][2]+a[4][2]+a[5][2]!=38) return 0;if(a[3][1]+a[4][1]+a[5][1]!=38) return 0;return 1;
}
bool check() {if(a[1][2]+a[2][2]+a[3][2]+a[4][1]!=38 && a[1][2]+a[2][2]+a[3][2]+a[4][1]<100000) return 0;if(a[1][3]+a[2][3]+a[3][3]+a[4][2]+a[5][1]!=38 && a[1][3]+a[2][3]+a[3][3]+a[4][2]+a[5][1]<100000) return 0;if(a[2][4]+a[3][4]+a[4][3]+a[5][2]!=38 && a[2][4]+a[3][4]+a[4][3]+a[5][2]<100000) return 0;if(a[3][5]+a[4][4]+a[5][3]!=38 && a[3][5]+a[4][2]+a[5][3]<100000) return 0;if(a[1][3]+a[2][4]+a[3][5]!=38 && a[1][3]+a[2][4]+a[3][5]<100000) return 0;if(a[1][2]+a[2][3]+a[3][4]+a[4][4]!=38 && a[1][2]+a[2][3]+a[3][4]+a[4][4]<100000) return 0;if(a[1][1]+a[2][2]+a[3][3]+a[4][3]+a[5][3]!=38 && a[1][1]+a[2][2]+a[3][3]+a[4][3]+a[5][3]<100000) return 0;if(a[2][1]+a[3][2]+a[4][2]+a[5][2]!=38 && a[2][1]+a[3][2]+a[4][2]+a[5][2]<100000) return 0;if(a[3][1]+a[4][1]+a[5][1]!=38 && a[3][1]+a[4][1]+a[5][1]<100000) return 0;   return 1;
}
void dfs(int x,int y) {if(x == 6) {if(cc() == 0) return;for(int i = 1; i<=5; i++) {for(int j = 1; j<=up[i]; j++) {printf("%d ",a[i][j]);}printf("\n");}return;            }if(check() == 0) return;if(ok[x][y]) {dfs(x,y+1);return;}for(int i = 1; i<=19; i++) {if(vis[i]) continue;if(all[x] + i > 38) continue;if(y == up[x]) {if(all[x] + i != 38) continue;else {all[x] += i;vis[i] = 1;a[x][y] = i;dfs(x+1,1);a[x][y] = 100000;all[x] -= i;vis[i] = 0;return;}}vis[i] = 1;all[x] += i;a[x][y] = i;dfs(x,y+1);a[x][y] = 100000;vis[i] = 0;all[x] -= i;}
}
int main()
{for(int i = 1; i<=5; i++) {for(int j = 1; j<=5; j++) a[i][j] = 100000;}a[1][1]=10;a[2][1]=13;a[3][1]=15;ok[1][1]=1;ok[2][1]=1;ok[3][1]=1;vis[10]=1;vis[13]=1;vis[15]=1;dfs(1,1);return 0 ;
}
//19:00-19:20/*
10 12 16
13 4 2 19
15 8 5 7 3
14 6 1 17
9 11 18*/

【蓝桥杯 - 真题】六角幻方(dfs+剪枝)相关推荐

  1. 蓝桥杯真题:九宫幻方

    题目: 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分. 三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. 三阶幻方又被 ...

  2. c语言六角填数蓝桥杯答案,六角填数(全排列)蓝桥杯真题

    六角填数(全排列)蓝桥杯真题 六角填数(全排列)蓝桥杯真题 如图所示六角形中填入1-12的数字,使每条直线上的数字和相等,图中已经填好了3个数字,请你计算*号数字是多少 蓝桥杯老套路,经常这样考全排列 ...

  3. 第六届蓝桥杯真题总结

    第六届蓝桥杯真题总结 第一题:奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求 ...

  4. # 2014年蓝桥杯真题CC++B组

    2014年蓝桥杯真题C/C++B组 1.啤酒和饮料 题目描述 啤酒每罐2.3元,饮料每罐1.9元,小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道她买的啤酒比饮料的数量多,请你计算他买了几罐啤 ...

  5. 蓝桥杯真题2017-2021

    刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...

  6. 第四届蓝桥杯真题解析【JavaC组】

    第四届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第四届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:组素数 C:马虎的算式 D:第39 ...

  7. 第九届蓝桥杯真题解析JavaC组

    第九届蓝桥杯真题解析JavaC组 文章目录 ***第九届蓝桥杯真题解析JavaC组*** 前言 A.哪天回家 B.猴子分香蕉 C.字母阵列 D.第几个幸运数 E.书号验证 F.打印大X G.缩位求和 ...

  8. 第五届蓝桥杯真题解析【JavaC组】

    第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...

  9. 蓝桥杯真题:三羊献瑞

    蓝桥杯真题:三羊献瑞 观查下面的加法算式: 其中相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. 分析 ...

  10. 第十届蓝桥杯c语言试题,第十届蓝桥杯真题编程题1-7解析(高级组).pdf

    scratch 少儿编程第十届蓝桥杯真题 7 大家好 ~今天我们来讲解 scratch 蓝桥杯第十届编程大题的第七道题. 同样,这道题也是非常有难度的一道题.一起来看一下吧 解析: 女孩的程序 1.在 ...

最新文章

  1. CEPH集群更换ip(更换ip前的防范和更换ip后的恢复)
  2. ACM程序设计选修课——1030: Hungar的时尚球场(水题+耐心)
  3. LARS 最小角回归算法简介
  4. QWT中Qdial的入门介绍
  5. SAP Spartacus SSR 模式下 index.html 页面的响应逻辑调试
  6. mysql定期删除数据_mysql数据库如何实现定期删除数据库一些东西
  7. latex填充段落之间的留白
  8. Java面试之JVM参数调优
  9. 俄罗斯电力公司T Plus完成25MW光伏电站
  10. 添加游戏到游戏浏览器中的小工具
  11. mybatis整合spring,使用org.mybatis.spring.mapper.MapperScannerConfigurer扫描出现问题
  12. C# 读取oracle 中文乱码的解决方案
  13. Deep Learning Algorithm for Cyberbullying Detection
  14. 关于DNS污染问题的通用解决方案
  15. CentOS Mac 安装zsh,使用oh-my-zsh
  16. Xposed获取微信个人信息
  17. Towards Two-Dimensional Sequence to Sequence Model和Two-Way Neural Machine Translation两篇论文简单分析
  18. 聊聊前端开发日常的协作工具(全)
  19. 精心整理了30个Python数据分析项目,拿走就用!
  20. C#控件篇 - PictureBox控件设置滚动条

热门文章

  1. 有意思的小学数学竞赛题-2
  2. 国外好的软件测试网站
  3. [Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]
  4. android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...
  5. ios信号从4g变成无服务器,苹果信号满格显示是4g却没网络
  6. html中设置负边距的意义,css负边距之详解
  7. python读取每一行文字二十四_python接口自动化(二十四)--unittest断言——中(详解)...
  8. mysql change index_MySQL · 引擎特性 · Innodb change buffer介绍
  9. python转r字符_python r不转义变量
  10. 3.6.4python下载安装教程_python 3.6.4安装教程