作者enthos (影斯)
看板CodeJob
标题Re: [发案] 徵求程式设计高手 (有关排列组合)
时间Mon Oct 19 20:59:59 2009
我不会 matlib.
我高中的科学竞赛内容(佳作)
正六角形的拼图六色不重复.
正反面不重复共 60 块.
中间留空, 从中间开始拼, 最多能拼几块?
6 色可以依序转成 0 ~ 119 的数字(序号),
就很方便计算.
很明显其中一种颜色固定位置为基准.
用顺时针顺序.
123456 = 0 (反面 119)
123465 = 1
123645 = 2
123654 = 3
...
165432 = 119
一看就知道序号大的数字也大,有对应关系.
我的程式可以从序号和数字之间互转,方便计算.
计算的 magic number:
1 2 6 24
以 165432 为例
a. 2 3 4 5 6 (剩下的颜色,依序排列)
0 1 2 3 4 (顺序值, 从零开始)
取 6, 4 * 24 = 96
b. 2 3 4 5
0 1 2 3
取 5, 3 * 6 = 18
c. 2 3 4
0 1 2
取 4, 2 * 2 = 4
d. 2 3
0 1
取 3, 1 * 1 = 1
96 + 18 + 4 + 1 = 119
此题类似:
原始问题和资料展开後如下:
共有 35 组
接案者可以找出从 "序号" 转成 "数字" 的公式.
这个问题不难,只需找出规律,建好表格.
题目似乎只要依序 printf, 这是更容易完成的.
如果有 "序号 => 数字" 的公式, 就可以在中途停止,
只记录一个序号的数值, 十分方便.
1 2 3 4 5 (资料的数字)
5 4 3 2 1 (依顺序能包含多少数量)
倒序比较容易看出累积数量.
(15 组)
111 = 0 34
112 = 1 33
113 = 2 32
114 = 3 31
115 = 4 30
122 = 5 29
123 = 6 28
124 = 7 27
125 = 8 26
133 = 9 25
134 = 10 24
135 = 11 23
144 = 12 22
145 = 13 21
155 = 14 20
(10 组)
222 = 15 19
223 = 16 18
224 = 17 17
225 = 18 16
233 = 19 15
234 = 20 14
235 = 21 13
244 = 22 12
245 = 23 11
255 = 24 10
(6 组)
333 = 25 9
334 = 26 8
335 = 27 7
344 = 28 6
345 = 29 5
355 = 30 4
(3 组) k 组
444 = 31 3
445 = 32 2
455 = 33 1
(1 组)
555 = 34 0
虽然因为 n 、 k 的数值大而要使用 bignum library,
不过实际的难度不高.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.22.98
1F:推 ckcraig:太好了 快去接案吧 10/19 21:44
2F:推 arrack:果真如此,现今的密码全部都要再强化过了 10/20 00:57
3F:→ arrack:而且原要求是可重复,不管顺序 10/20 01:00
4F:推 Huangs:这篇还满逗趣的 XD 10/20 15:01