- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40155
- 在线时间
- 小时
|
发表于 2019-3-26 19:08:29
来自手机
|
显示全部楼层
由于限定不足解太多,我们可以考虑更多限制,如上面hujunhua的例子,满足所有和坐标轴平行直线上三格数据和为42以及所有过中心三格数据和为42。首先容易得出此时中心必然为14。
于是设第一个面数据为
a,b,42-a-b
c,d,42-c-d
42-a-c,42-b-d,a+b+c+d-42
于是可以得出最下面一个面为
70-a-b-c-d,b+d-14,a+c-14
c+d-14,28-d,28-c
a+b-14,28-b,28-a
于是可以得出中间的面
b+c+d-28,56-2b-d,14+b-c
56-d-2c,14,2c+d-28
14+c-b,2b+d-28,56-b-c-d
所以这种模式只要穷举a,b,c,d四个字母就可以求出所有满足条件的解
对于这种限制,总共只有四组解:
10 24 8
26 1 15
6 17 19
23 7 12
3 14 25
16 21 5
9 11 22
13 27 2
20 4 18
12 23 7
26 1 15
4 18 20
22 9 11
3 14 25
17 19 6
8 10 24
13 27 2
21 5 16
16 23 3
24 1 17
2 18 22
20 9 13
7 14 21
15 19 8
6 10 26
11 27 4
25 5 12
18 22 2
23 3 16
1 17 24
20 9 13
7 14 21
15 19 8
4 11 27
12 25 5
26 6 10
- #include <stdio.h>
- #include <string.h>
- #define check(x) if((x)<=0||(x)>27||buf[x])continue;buf[x]=1;
- void output(int a,int b,int c,int d)
- {
- if(d>28-d)return;
- if(56-d-2*c>2*c+d-28)return;
- if(56-2*b-d>2*b+d-28)return;
- if(d>56-d-2*c)return;
- if(56-d-2*c>56-2*b-d)return;
- printf("%d\t%d\t%d\n",a,b,42-a-b);
- printf("%d\t%d\t%d\n",c,d,42-c-d);
- printf("%d\t%d\t%d\n\n",42-a-c,42-b-d,a+b+c+d-42);
- printf("%d\t%d\t%d\n",b+c+d-28,56-2*b-d,14+b-c);
- printf("%d\t%d\t%d\n",56-d-2*c,14,2*c+d-28);
- printf("%d\t%d\t%d\n\n",14+c-b,2*b+d-28,56-b-c-d);
- printf("%d\t%d\t%d\n",70-a-b-c-d,b+d-14,a+c-14);
- printf("%d\t%d\t%d\n",c+d-14,28-d,28-c);
- printf("%d\t%d\t%d\n\n\n",a+b-14,28-b,28-a);
- }
- int main()
- {
- int a,b,c,d;
- char buf[28];
- for(a=1;a<=27;a++)for(b=1;b<=27;b++)for(c=1;c<=27;c++)for(d=1;d<=27;d++){
- memset(buf,0,sizeof(buf));
- buf[a]=1;
- check(b);check(c);check(d);check(14);
- check(42-a-b);check(42-c-d);
- check(42-a-c);check(42-b-d);check(a+b+c+d-42);
- check(70-a-b-c-d);check(b+d-14);check(a+c-14);
- check(c+d-14);check(28-d);check(28-c);
- check(a+b-14);check(28-b);check(28-a);
- check(b+c+d-28);check(56-2*b-d);check(14+b-c);
- check(56-d-2*c);check(2*c+d-28);check(14+c-b);
- check(2*b+d-28);check(56-b-c-d);
- output(a,b,c,d);
- }
- }
复制代码
比较申请这四组解和中心挨着的三个较小数正好都是1,3,7,9四个数中任意挑三个后。
而在确定这三格后,马上可以推算出除了8个顶点以外的所有数字。最后,由于余下数字不多,推算8个顶点处数字就比较容易了。这种方法可以作为人工复盘的方案。 |
|