题目
如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
全排列,暴力。(当然也可以手算)
总共12个数,填好了三个数,还剩九个数。(看到 9 我就想全排啊!!!)
规定从左到右,从上到下每行的空缺位置的索引从0开始增加,如下图:
索引为3处的值就是我们要填写的值。
我将剩下的九个值进行全排列,对于每一种排列方式,索引为0对应的值就表示在0处填上该值,索引为1对应的值就表示在1处填上该值,……。对于每一种排列方式(也即每一种填法),都判断每条线之和是否相等,如果相等说明我们找到了正确的排列方式(填法),输出索引为3处的值,就是答案。
判断每条线的和是否相等:
8 + a[0] + a[1] + a[2] // 头朝下三角形的底所在线
8 + a[3] + a[6] + 3 // 头朝下三角形的左腰所在线
a[2] + a[4] + s[7] + 3 // 头朝下三角形的右腰所在线
a[5] + a[6] + a[7] + a[8] // 头朝上三角形的底所在线
1 + a[0] + a[3] + a[5] // 头朝上三角形的左腰所在线
1 + a[1] + a[4] + a[8] // 头朝上三角形的右腰所在线
代码
#include
using namespace std;
// 1 3 8
// 2 4 5 6 7 9 10 11 12
/*
O(0) O(1) O(2)
O(3) O(4)
O(5) O(5) O(6) O(7)
// 括号内为索引
*/
int s[9] = {2, 4, 5, 6, 7, 9, 10, 11, 12};
int ans;
int main()
{
do {
int x1 = 8 + s[0] + s[1] + s[2];
int x2 = 8 + s[3] + s[6] + 3;
int x3 = s[2] + s[4] + s[7] + 3;
int x4 = s[5] + s[6] + s[7] + s[8];
int x5 = 1 + s[0] + s[3] + s[5];
int x6 = 1 + s[1] + s[4] + s[8];
if (x1 == x2 && x2 == x3 && x3 == x4 && x4 == x5 && x5 == x6)
cout
关注
打赏