2

我必须编写一个 C 程序(用于我的离散数学作业),找到从集合A (|A| = m)到集合的函数数量B (|B|=n)并显示所有这些函数。我使用代码计算的 on 函数数:

for(k=0; k<n; k++)
    x = x + pow( -1, k) * combination( n, n - k ) * pow( ( n - k ), m);

其中组合是查找可能组合数的函数。

例如,如果 A = {1,2,3}, B={a,b,c},则从公式计算的到函数的数量为 3^3 - 3(2^3) + 3 = 6。一种可能解决方案是 f = {(1,a),(2,b),(3,c)} [我知道这是一个解决方案]。

但我的问题是:如何显示每一个解决方案!?这只是一个简单的例子。但是如果 m 和 n 值增加(假设 m>=n),那么可能的函数数量会成倍增加!例如,如果 m=7 和 n=4,则有 8400 个函数!

我想不出任何方法来显示 A 和 B 之间存在的每个函数。

4

1 回答 1

4

前段时间我回答了一个类似的问题,但 m 和 n 是相等的m = n。(你必须递归思考才能解决这个问题),根据你的评论,我认为可能的答案是:{(1,a)(2,b)(3,c)}, {(2,a)(3,b)(1,c)}, {(3,a)(1,b)(2,c)}, {(3,a)(2,b)(1,c)}, {(2,a)(1,b)(3,c)} and {(1,a)(3,b)(2,c)}那么这是我的食谱:

  1. 用它们的初始值设置 2 个数组,让我们称它们为lettersnumbers

    *---*---*---*                          *---*---*---*
    | a | b | c | <---letters.             | 1 | 2 | 3 | <---numbers.
    *---*---*---*                          *---*---*---*
    
  2. 选择其中一个数组作为您的支点,我选择了letters,它将是静态的。

    *---*---*---*                          *---*---*---*
    | a | b | c | <---STATIC.              | 1 | 2 | 3 | <---DYNAMIC.
    *---*---*---*                          *---*---*---*
    
  3. 根据需要逆时针或顺时针旋转动态数组,您必须i element of numbers使用i element of letters.

    *---*---*---*               *---*---*---*                 *---*---*---* 
    | 1 | 2 | 3 |   -(Print)->  | 2 | 3 | 1 |    -(Print)->   | 3 | 1 | 2 |
    *---*---*---*               *---*---*---*                 *---*---*---*
    

所以你在这一点上得到:{(1,a)(2,b)(3,c)}, {(2,a)(3,b)(1,c)}, {(3,a)(1,b)(2,c)}, 3 丢失了。

  1. i elementn element动态数组的交换。

    *---*---*---*                                     *---*---*---*
    | 1 | 2 | 3 |   ---------( Swap (0<->2) )-------> | 3 | 2 | 1 | 
    *---*---*---*                                     *---*---*---*
    
  2. 重复步骤 3。

    *---*---*---*               *---*---*---*                 *---*---*---* 
    | 3 | 2 | 1 |   -(Print)->  | 2 | 1 | 3 |    -(Print)->   | 1 | 3 | 2 |
    *---*---*---*               *---*---*---*                 *---*---*---*
    

所以你得到了错过的子集:{(3,a)(2,b)(1,c)}, {(2,a)(1,b)(3,c)} and {(1,a)(3,b)(2,c)}.

如果您有超过 3 个示例 4. 简单:(1234旋转 N 次,其中 N 是变量的数量并随着每次移动打印),交换 1 和 4 -> 4231(旋转和打印),交换 2 和 3 -> 4321(旋转和打印),交换 4 和 1 --> 1324(旋转和打印)。

我希望这会有所帮助。

于 2012-11-25T19:40:31.537 回答