☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Thu Aug 25 19:00:48 2022) 提到:
[upload=1][/upload]
[upload=2][/upload][upload=3][/upload]
我只能想到这两种,请问还有第三种填法吗?如何证明没有呢?(数字仅限 0到9)
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Thu Aug 25 19:03:51 2022) 提到:
有大佬能证明出来吗?
☆─────────────────────────────────────☆
upndown (每天锻炼2小时为祖国健康工作100年) 于 (Thu Aug 25 20:32:46 2022) 提到:
123换成456
789换成456
【 在 feng321 的大作中提到: 】
: [upload=1][/upload]
: [upload=2][/upload][upload=3][/upload]
: 我只能想到这两种,请问还有第三种填法吗?如何证明没有呢?(数字仅限 0到9)
: ...................
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Thu Aug 25 21:10:22 2022) 提到:
谢谢,加上你的两种解法,这道题也就四种情况。还有没有其他解法?如何证明没有?
【 在 upndown 的大作中提到: 】
: 123换成456
: 789换成456
:
☆─────────────────────────────────────☆
upndown (每天锻炼2小时为祖国健康工作100年) 于 (Thu Aug 25 21:37:05 2022) 提到:
有啊,所有数减去1,用012和789
【 在 feng321 的大作中提到: 】
: 谢谢,加上你的两种解法,这道题也就四种情况。还有没有其他解法?如何证明没有?
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 11:56:48 2022) 提到:
谢谢,这是个小学一年级的题目。题设已知条件得修改一下:只能在1——9中选数字,不包好0.还有别的填法吗?如何证明没有?
【 在 upndown 的大作中提到: 】
: 有啊,所有数减去1,用012和789
:
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 12:02:05 2022) 提到:
用这个图中的7、8、9分别减一,就是一种新的了。一直减到4、5、6为止,这样就有4种了。问题是我一拿到这个题目,就蒙了,不知道该从哪里下手?大佬有没有什么建议?这个题目该如何分析呢?
【 在 upndown 的大作中提到: 】
: 有啊,所有数减去1,用012和789
:
[upload=1][/upload]
☆─────────────────────────────────────☆
arya123 (qing) 于 (Fri Aug 26 13:40:26 2022) 提到:
选取0-9之间两个公差相同的等差数列,两个数列的数字分别一一对应。
把一个数列里最大的数放在三角形的边上,那么对面角上的就是另一个数列中最大的数。同理,最小的对应最小的,中间的对应中间的。
因此,已选定的两组数列就有12种位置布置。2*3*2*1=12
数列选取有24种。
0,1,2对应3,4,5;4,5,6;5,6,7;6,7,8;7,8,9
1,2,3对应4,5,6;5,6,7;6,7,8;7,8,9
2,3,4对应5,6,7;6,7,8,;7,8,9
3,4,5对应6,7,8;7,8,9
4,5,6对应7,8,9
0,2,4对应1,3,5;3,5,7;5,7,9
2,4,6对应3,5,7;5,7,9
4,6,8对应5,7,9
1,3,5对应2,4,6;4,6,8
3,5,7对应4,6,8
12*24,一共有288种布置。
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 13:58:53 2022) 提到:
谢谢,差不多就288种了。现在的问题是:如何给小学1年级的学生,讲这道题呢?
【 在 arya123 的大作中提到: 】
: 选取0-9之间两个公差相同的等差数列,两个数列的数字分别一一对应。
: 把一个数列里最大的数放在三角形的边上,那么对面角上的就是另一个数列中最大的数。同理,最小的对应最小的,中间的对应中间的。
: 因此,已选定的两组数列就有12种位置布置。2*3*2*1=12
: ...................
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 14:12:14 2022) 提到:
数列0 3 6 和1 4 7,以及 2 5 8,也行啊
【 在 arya123 的大作中提到: 】
: 选取0-9之间两个公差相同的等差数列,两个数列的数字分别一一对应。
: 把一个数列里最大的数放在三角形的边上,那么对面角上的就是另一个数列中最大的数。同理,最小的对应最小的,中间的对应中间的。
: 因此,已选定的两组数列就有12种位置布置。2*3*2*1=12
: ...................
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 14:13:46 2022) 提到:
0 4 8 和 1 5 9 也行
【 在 arya123 的大作中提到: 】
: 选取0-9之间两个公差相同的等差数列,两个数列的数字分别一一对应。
: 把一个数列里最大的数放在三角形的边上,那么对面角上的就是另一个数列中最大的数。同理,最小的对应最小的,中间的对应中间的。
: 因此,已选定的两组数列就有12种位置布置。2*3*2*1=12
: ...................
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 14:21:48 2022) 提到:
谢谢回复,但填数,不一定要等差数列啊。比如 0 1 7 和2 3 9也行啊。
【 在 arya123 的大作中提到: 】
: 选取0-9之间两个公差相同的等差数列,两个数列的数字分别一一对应。
: 把一个数列里最大的数放在三角形的边上,那么对面角上的就是另一个数列中最大的数。同理,最小的对应最小的,中间的对应中间的。
: 因此,已选定的两组数列就有12种位置布置。2*3*2*1=12
: ...................
☆─────────────────────────────────────☆
arya123 (qing) 于 (Fri Aug 26 17:05:08 2022) 提到:
【 在 feng321 的大作中提到: 】
: 0 4 8 和 1 5 9 也行
三个数字两两之差为M和N
那么2≤M+N≤7
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Fri Aug 26 20:08:19 2022) 提到:
三个数字,两两之差,可能有三种情况,而不仅仅是M和N
【 在 arya123 的大作中提到: 】
:
: 三个数字两两之差为M和N
: 那么2≤M+N≤7
☆─────────────────────────────────────☆
z16166 (Netguy) 于 (Fri Aug 26 23:11:53 2022) 提到:
写了个demo程序穷举了一下,0-9的话有204个不重复的解,1-9的话106个不重复的解。
两个解的3个顶点上的数构成的集合相同,而且3个边上的数构成的集合也相同的话,认为这两个解是重复解。
重复解的几何解释是:一个三角形是由另外一个三角形经过旋转、左右对称交换而得到的。
重复解的个数的话,要乘上6(3个顶点的全排列是6),分别是1224、636。
用g++或者msvc编译(不支持vc6)
#include <algorithm>
#include <map>
#include <stdint.h>
#include <stdio.h>
std::map<uint32_t, size_t> uniqueSolutions;
size_t solutionNumber = 0;
bool IsDuplicate(const unsigned char a, const unsigned char b,
const unsigned char c, const unsigned char d,
const unsigned char e, const unsigned char f, size_t &prev) {
unsigned char data[6] = {a, c, e, b, d, f};
// 三角形的3个顶点上的3个数
std::sort(data, data + 3);
// 三角形的3条边上的3个数
std::sort(data + 3, data + 6);
uint32_t merged = 0;
for (size_t k = 0; k < 6; ++k) {
merged |= (uint32_t)data[k] << (k * 4);
}
auto i = uniqueSolutions.lower_bound(merged);
if (i != uniqueSolutions.end() &&
!(uniqueSolutions.key_comp()(merged, i->first))) {
prev = i->second;
return true;
}
uniqueSolutions.insert(i,
std::pair<uint32_t, size_t>(merged, solutionNumber));
return false;
}
void Solve(const unsigned char base) {
solutionNumber = 0;
uniqueSolutions.clear();
bool used[10] = {};
for (unsigned char a = base; a <= 9; ++a) {
used[a] = true;
for (unsigned char b = base; b <= 9; ++b) {
if (used[b])
continue;
used[b] = true;
for (unsigned char c = base; c <= 9; ++c) {
if (used[c])
continue;
used[c] = true;
for (unsigned char d = base; d <= 9; ++d) {
if (used[d])
continue;
used[d] = true;
for (unsigned char e = base; e <= 9; ++e) {
if (used[e])
continue;
used[e] = true;
for (unsigned char f = base; f <= 9; ++f) {
if (used[f])
continue;
const auto sum = a + b + c;
if (sum == (c + d + e) && sum == (e + f + a)) {
++solutionNumber;
size_t previousNumber;
bool dupe = IsDuplicate(a, b, c, d, e, f, previousNumber);
if (dupe)
printf("%zu: %u %u %u %u %u %u (dupe: %zu)\n", solutionNumber,
a, b, c, d, e, f, previousNumber);
else
printf("%zu: %u %u %u %u %u %u\n", solutionNumber, a, b, c, d,
e, f);
}
}
used[e] = false;
}
used[d] = false;
}
used[c] = false;
}
used[b] = false;
}
used[a] = false;
}
printf("count of unique solutions: %zu\n", uniqueSolutions.size());
}
int main() {
Solve(0);
Solve(1);
return 0;
}
☆─────────────────────────────────────☆
z16166 (Netguy) 于 (Fri Aug 26 23:36:56 2022) 提到:
一年级就是找一个特例解就行吧。要是一年级能搞懂全部解的话,属于智力超常了。
【 在 feng321 的大作中提到: 】
: 谢谢,这是个小学一年级的题目。题设已知条件得修改一下:只能在1——9中选数字,不包好0.还有别的填法吗?如何证明没有?
☆─────────────────────────────────────☆
easior (潜行) 于 (Sat Aug 27 12:22:28 2022) 提到:
程序不完整,BYTE、merged 都没有定义
【 在 z16166 的大作中提到: 】
: 写了个demo程序穷举了一下,0-9的话有204个不重复的解,1-9的话106个不重复的解。
: 两个解的3个顶点构成的集合相同而且3个边上的点构成的集合也相同的话,认为这两个解是重复解(一个三角形是由另外一个三角形经过旋转和左右对称交换而得到的)。重复解的个数的话,要乘上6,分别是1224、636。
: [code=c]
: ...................
☆─────────────────────────────────────☆
z16166 (Netguy) 于 (Sat Aug 27 12:35:41 2022) 提到:
自己定义一下就行。我把代码更新了一下,用g++或者msvc编译(vc6不行)。
typedef unsigned char BYTE;
typedef unsigned long long uint64_t; // 也可以 #include <stdint.h>
【 在 easior 的大作中提到: 】
: 程序不完整,BYTE、merged 都没有定义
☆─────────────────────────────────────☆
maruko (没文化,真害怕) 于 (Sat Aug 27 16:11:11 2022) 提到:
小学一年级你非要让他懂这道题,揠苗助长了。
题目里适当的填好三个或者四个数,就是小学一年级该会的。
【 在 feng321 的大作中提到: 】
: 谢谢,差不多就288种了。现在的问题是:如何给小学1年级的学生,讲这道题呢?
: --
发自「今日水木 on iPad mini 5」
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Sat Aug 27 18:42:47 2022) 提到:
谢谢大佬的代码。只是我用python写的代码,不重复的解是210个啊。算上重复的解,是1224个。怎么回事呢?
解法集合 =set()
解法字典= {}
所有解法字典={}
顶点集合=set()
边上点集合=set()
解法数 = 0
for a1 in range(0,10):
#print(a1)
for a2 in range(0,10):
for a3 in range(0,10):
for a4 in range(0,10):
for a5 in range(0,10):
for a6 in range(0,10):
if(a1+a2+a3 == a3+a4+a5 and a3+a4+a5 == a5+a6+a1 and a1!=a2 and a2!=a3 and a1!=a3
and a1!=a4 and a2!=a4 and a3!=a4
and a1!=a5 and a2!=a5 and a3!=a5 and a4!=a5
and a1!=a6 and a2!=a6 and a3!=a6 and a4!=a6 and a5!=a6):
顶点集合.add(a1)
顶点集合.add(a3)
顶点集合.add(a5)
边上点集合.add(a2)
边上点集合.add(a4)
边上点集合.add(a6)
# print(顶点集合)
# print(边上点集合)
解法字典[1]=a1
解法字典[2] = a2
解法字典[3] = a3
解法字典[4] = a4
解法字典[5] = a5
解法字典[6] = a6
print(解法字典)
解法数 = 解法数 + 1
所有解法字典.update({解法数: 解法字典})
#print(所有解法字典)
解法字典={}
临时顶点集合 =set()
临时边上点集合 =set()
顶点集合 = set()
边上点集合 = set()
#print(str(a1)+" "+str(a2)+" "+str(a3)+" "+str(a4)+" "+str(a5)+" "+str(a6)+" ")
print(解法数)
print(所有解法字典)
# #去重
顶点集合=set()
边上点集合=set()
临时顶点集合 =set()
临时边上点集合 =set()
for temp in range(1, 解法数 + 1):
for temp2 in range(temp+1,解法数 + 1):
临时字典 = 所有解法字典[temp]
if (temp > 1200):
print(所有解法字典)
if (len(临时字典) != 0):
临时顶点集合.add(临时字典[1])
临时顶点集合.add(临时字典[3])
临时顶点集合.add(临时字典[5])
临时边上点集合.add(临时字典[2])
临时边上点集合.add(临时字典[4])
临时边上点集合.add(临时字典[6])
else:
continue
临时字典2 = 所有解法字典[temp2]
print(str(temp)+" 写几个字 "+str(temp2))
print(临时字典2)
if(len(临时字典2)!=0):
顶点集合.add(临时字典2[1])
顶点集合.add(临时字典2[3])
顶点集合.add(临时字典2[5])
边上点集合.add(临时字典2[2])
边上点集合.add(临时字典2[4])
边上点集合.add(临时字典2[6])
else:
continue
if (临时顶点集合 == 顶点集合 and 临时边上点集合 == 边上点集合):
# 解法数 = 解法数 - 1
#del 所有解法字典[解法数]
所有解法字典.update({temp2: {}})
顶点集合 = set()
边上点集合 = set()
临时顶点集合 = set()
临时边上点集合 = set()
不同的解法=0
for i in range(1,解法数 + 1):
if (len(所有解法字典[i])!= 0 ):
不同的解法=不同的解法+1
print(不同的解法)
【 在 z16166 的大作中提到: 】
: 写了个demo程序穷举了一下,0-9的话有204个不重复的解,1-9的话106个不重复的解。
: 两个解的3个顶点上的数构成的集合相同,而且3个边上的数构成的集合也相同的话,认为这两个解是重复解。
: 重复解的几何解释是:一个三角形是由另外一个三角形经过旋转、左右对称交换而得到的。
: ...................
☆─────────────────────────────────────☆
z16166 (Netguy) 于 (Sat Aug 27 19:25:31 2022) 提到:
set( )里的元素要排序一下。消重的那个大循环改成这样就是204:
# #去重
for temp in range(1, 解法数 + 1):
临时顶点集合 = set()
临时边上点集合 = set()
临时字典 = 所有解法字典[temp]
if (len(临时字典) != 0):
临时顶点集合.add(临时字典[1])
临时顶点集合.add(临时字典[3])
临时顶点集合.add(临时字典[5])
临时顶点集合 = sorted(临时顶点集合)
临时边上点集合.add(临时字典[2])
临时边上点集合.add(临时字典[4])
临时边上点集合.add(临时字典[6])
临时边上点集合 = sorted(临时边上点集合)
else:
continue
for temp2 in range(temp + 1, 解法数 + 1):
顶点集合 = set()
边上点集合 = set()
临时字典2 = 所有解法字典[temp2]
if (len(临时字典2) != 0):
顶点集合.add(临时字典2[1])
顶点集合.add(临时字典2[3])
顶点集合.add(临时字典2[5])
顶点集合 = sorted(顶点集合)
边上点集合.add(临时字典2[2])
边上点集合.add(临时字典2[4])
边上点集合.add(临时字典2[6])
边上点集合 = sorted(边上点集合)
else:
continue
if (临时顶点集合 == 顶点集合 and 临时边上点集合 == 边上点集合):
所有解法字典.update({temp2: {}})
不同的解法 = 0
for i in range(1, 解法数 + 1):
if (len(所有解法字典[i]) != 0):
不同的解法 = 不同的解法 + 1
print(不同的解法)
【 在 feng321 的大作中提到: 】
: 谢谢大佬的代码。只是我用python写的代码,不重复的解是210个啊。算上重复的解,是1224个。怎么回事呢?
: 解法集合 =set()
: 解法字典= {}
: ...................
☆─────────────────────────────────────☆
feng321 (sfdf) 于 (Sat Aug 27 21:15:47 2022) 提到:
谢谢,这样写,确实是 204.可是我如果按照先前的写法,是多了哪6个呢?
# #去重
顶点集合=set()
边上点集合=set()
临时顶点集合 =set()
临时边上点集合 =set()
for temp in range(1, 解法数 + 1):
临时顶点集合 = set()
临时边上点集合 = set()
临时字典 = 所有解法字典[temp]
if (len(临时字典) != 0):
临时顶点集合.add(临时字典[1])
临时顶点集合.add(临时字典[3])
临时顶点集合.add(临时字典[5])
临时边上点集合.add(临时字典[2])
临时边上点集合.add(临时字典[4])
临时边上点集合.add(临时字典[6])
else:
continue
for temp2 in range(temp+1,解法数 + 1):
# if (temp > 1200):
# print(所有解法字典)
临时字典2 = 所有解法字典[temp2]
print(str(temp)+" 写几个字 "+str(temp2))
print(临时字典2)
if(len(临时字典2)!=0):
顶点集合.add(临时字典2[1])
顶点集合.add(临时字典2[3])
顶点集合.add(临时字典2[5])
边上点集合.add(临时字典2[2])
边上点集合.add(临时字典2[4])
边上点集合.add(临时字典2[6])
else:
continue
if (临时顶点集合 == 顶点集合 and 临时边上点集合 == 边上点集合):
# 解法数 = 解法数 - 1
#del 所有解法字典[解法数]
所有解法字典.update({temp2: {}})
顶点集合 = set()
边上点集合 = set()
不同的解法=0
for i in range(1,解法数 + 1):
if (len(所有解法字典[i])!= 0 ):
不同的解法=不同的解法+1
print(不同的解法)
【 在 z16166 的大作中提到: 】
: set( )里的元素要排序一下。消重的那个大循环改成这样就是204:
: # #去重
: for temp in range(1, 解法数 + 1):
: ...................
☆─────────────────────────────────────☆
z16166 (Netguy) 于 (Sat Aug 27 21:49:01 2022) 提到:
把两种写法的全部不重复的解sorted后各自输出为一个txt,然后用比较txt的工具比较
或者两种写法的全部不重复的解在同一个py代码里存为两个不同的字典A、B,比较A、B这两个字典的差异
【 在 feng321 的大作中提到: 】
: 谢谢,这样写,确实是 204.可是我如果按照先前的写法,是多了哪6个呢?
: # #去重
: 顶点集合=set()
: ...................