【算法】一个N*N个数取N但重复数不超过M的算法
下午逛BBS发现C版上有一个询问算法的帖子,感觉不是很难,就做了做;但时间比较紧,只有思路,没完成;晚上回来想了想,解出来后在这里留个备份。
问题:
请问,
1,2,......,36共36个自然数,从中取出若干个6个数字的数组;6个数字不重复;数组中
不出现同时有两个数字重复的情况。比如{1,2,3,4,5,6}与{1,2,7,8,9,10}中{
1,2}同时出现而应舍弃一组。
请问,这样的数组有42个吗(即36取2的组合,是否可以改写成42个6取2的组合),拜求结
果。
我对这个题目进行重新表述:
在 N*N 个数中,取出 N 个数成为一数组, 把这一组放入结果集中;要求结果集包含的数组尽可能地多,但另一个要求是,结果集中任意两个数组的交集的元素数目小于M,求满足要求的结果集包含的数组数目。
拿 N = 3; M = 2 来说明问题:设 这N*N个数分别为 a1,a2,...,a9
一个答案是 3 * 4 = 12 个
{1,2,3},{4,5,6},{7,8,9}
{1,4,7},{2,5,8},{3,6,9}
{1,5,9},{2,6,7},{3,4,8}
{1,6,8},{2,4,9},{3,5,7}
可以验证,上面的12个数组两两交集数目不超过1(也即小于2)
我这里就不再进行整理了。
问题的分析及思路:
1、
这个题目跟八皇后有点儿像(但不要求斜着也不在一条线上)
解的步骤可以一步一步往结果集里添加,问题的关键在于去除不合要求的解。一个办法是对其进行分类,将“重复”的划分为一类,计算一些分类的数目,也能够得出一类中的个数。
时间有限,不做了。。。
2、
设满足要求的一个结果为集合S,即结果集,我们一步一步往结果集里增加数组。
第一步:
这36个数,可以对其进行划分,根据对称性,不妨划分成6个数组,如下:
S1 = {1, 2, 3, 4, 5, 6}
S2 = {7, 8, 9, 10, 11, 12}
...
S6 = {31, 32, 33, 34, 35, 36}
S1~S6之间,任意两个数组交集为空。
将S1~S6放入结果集S中。
第二步:寻求更多的数组
任意的其它数组,是必然要从S1~S6中,每个数组取1个元素组成,否则就会与S1~S6的某
个数组有至少两个重复的数字。另外,这些数组与S1~S6中的任一个有且仅有一个重复的
数,因此只需要考虑新添加的数组之间的重复关系。
一些很直观的解是:
S7 = {1, 7, 13, 19, 25, 31}
...
S12 = {6, 12, 18, 24, 30, 36}
我们把它们也放到结果集里去。
更多的数组,我们用图形的办法来说明。
在纸上画6*6的小方格,每一行代表上面的S1~S6,每个小格子代表S1~S6中的元素。
第二步的问题等同于:在 6*6 的格子上画6个圈,它们的排布要满足:每行一个(因为不
能与S1~S6重复两个以上),每列也1个(否则与S7~S12重复两个以上)
这些圈圈出来的数所组成的,就是期望的数组。
===============这里错了唉,这些数组之间还有重复,还得想办法去掉重复的==============
===============算了,我得忙自己的了,LZ知道怎么算了把结果发出来吧。。。=======
把这些数放进结果集中,就完成了。不能放入更多的解了。
3、
继续这个思路,下午没有完成。
需要说明的是,画圈的办法,不是为了求解,而是为了探索解的特征、解所需要满足的要
求,这样才能够生成算法。
====个数判别====
以下办法证明了,在6*6的情况下,的确有6 + 6 + 6*5 = 42 个解:
如我所说,取每行,每列后,此问题等价于在格子上画圈,覆盖每行每列。并且要满足题
目的要求。
先画第一行的圈,有6中选择,不妨设取了 S1(i1)
再画第二行,有5种选择,不妨设取了 S2(i1);
然后剩下是4行,虽然有 4!=24 种画圈的办法,但是只能取其中一种;因为无论怎么取,
其结果都包含 S1(i1) 与 S2(i1),因此只取它们中的一种。
此方法还揭示了,如果是 N*N 个数,那么总共满足要求的解,共有 N*(N+1)个
====算法生成====
拿 N * N 为例
首先取所有的 N 行;然后取所有的 N 列;得到 2N 个
然后,一个双重循环,第一重为第一行,取遍 1 ~ 6
第二重为第二行,取遍 1 ~ 6 ,但不于第一行重复
在剩下的 N-2 * N-2 随便取一个可行的。
这样得到了一个【模板】,包括了所有 N*(N+1) 个数组
这里还没有结束,根据对称性,可以将 1~36 这些数中随便交换,你都可以得到一个N*(
N+1) 个满足题目要求的数组。
因此,每种解是包含N*(N+1)个数组的,但这样的解一共有 6!个。
另外,可能我思维比较发散,我一下子就看懂LZ想要表述的问题了,但很多人表示看不懂。。。
那位同学的提问帖:https://bbs.sjtu.edu.cn/bbscon?board=C&file=M.1332560255.A
我回复的原帖为 https://bbs.sjtu.edu.cn/bbscon?board=C&file=M.1332605422.A

浙公网安备 33010602011771号