数学复式问题

txyhj500 2015-03-21 10:23:09
数组 1 2 3 4 5 6 7 8 9 这样一组数组。

任意一个数字移动得出不同的排列组合。
例如; 把2移动到数字1的前面,那么组合排列变成2 1 3 4 5 6 7 8 9 这样一组数组。


那么,不同的组合排列一共多少?代码中如何得出所有不同组合复式呢?

...全文
387 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-03-25
  • 打赏
  • 举报
回复
全排列就是 n!,课本上都学过的,还有什么好讨论的。
  • 打赏
  • 举报
回复
你的问题是一组数字,任意移动一位数字,然后可以有多少组合,而不是同一时间所有数字都可移动
txyhj500 2015-03-25
  • 打赏
  • 举报
回复
引用 13 楼 Tiger_Zhao 的回复:
9个数字,每个数字可以移动的位置有8个,所以8*9=72种移动方式。 其中相邻两个数(比如12),前面的后移一格、后面的前移一格是相同的(都是21)。共8个相邻位要去掉重复。 统计公式为:n*(n-1)-(n-1) = (n-1)*(n-1)
Imports System

Module Module1

    Dim a() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim moveCount As Integer = 0

    Sub Move(ByVal i As Integer, ByVal j As Integer)
        Dim b(a.Length - 1) As Integer
        Array.Copy(a, b, a.Length)

        If i < j Then '向右移'
            Array.Copy(a, i + 1, b, i, j - i)
            b(j) = a(i)
        Else '向左移'
            Array.Copy(a, j, b, j + 1, i - j)
            b(j) = a(i)
        End If

        moveCount += 1

        Console.Write("{0:d2},", moveCount)
        For k As Integer = 0 To b.Length - 1
            Console.Write("{0:d1}", b(k))
        Next
        Console.WriteLine()
    End Sub

    Sub Main()
        For i As Integer = 0 To a.Length - 1 '源位置'
            For j As Integer = 0 To a.Length - 1 '目标位置'
                If (i <> j) AndAlso (i <> (j + 1)) Then '相邻位移动只取后移'
                    Move(i, j)
                End If
            Next
        Next

        Console.ReadLine()
    End Sub

End Module
01,213456789
02,231456789
03,234156789
04,234516789
05,234561789
06,234567189
07,234567819
08,234567891
09,132456789
10,134256789
11,134526789
12,134562789
13,134567289
14,134567829
15,134567892
16,312456789
17,124356789
18,124536789
19,124563789
20,124567389
21,124567839
22,124567893
23,412356789
24,142356789
25,123546789
26,123564789
27,123567489
28,123567849
29,123567894
30,512346789
31,152346789
32,125346789
33,123465789
34,123467589
35,123467859
36,123467895
37,612345789
38,162345789
39,126345789
40,123645789
41,123457689
42,123457869
43,123457896
44,712345689
45,172345689
46,127345689
47,123745689
48,123475689
49,123456879
50,123456897
51,812345679
52,182345679
53,128345679
54,123845679
55,123485679
56,123458679
57,123456798
58,912345678
59,192345678
60,129345678
61,123945678
62,123495678
63,123459678
64,123456978
一共只有这64种? 我不敢相信! 还有很多如下组合呢 任何复式组合一共可能上几万个! 125743689 126745389 183745629 923745681
Tiger_Zhao 2015-03-24
  • 打赏
  • 举报
回复
9个数字,每个数字可以移动的位置有8个,所以8*9=72种移动方式。
其中相邻两个数(比如12),前面的后移一格、后面的前移一格是相同的(都是21)。共8个相邻位要去掉重复。
统计公式为:n*(n-1)-(n-1) = (n-1)*(n-1)
Imports System

Module Module1

Dim a() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim moveCount As Integer = 0

Sub Move(ByVal i As Integer, ByVal j As Integer)
Dim b(a.Length - 1) As Integer
Array.Copy(a, b, a.Length)

If i < j Then '向右移'
Array.Copy(a, i + 1, b, i, j - i)
b(j) = a(i)
Else '向左移'
Array.Copy(a, j, b, j + 1, i - j)
b(j) = a(i)
End If

moveCount += 1

Console.Write("{0:d2},", moveCount)
For k As Integer = 0 To b.Length - 1
Console.Write("{0:d1}", b(k))
Next
Console.WriteLine()
End Sub

Sub Main()
For i As Integer = 0 To a.Length - 1 '源位置'
For j As Integer = 0 To a.Length - 1 '目标位置'
If (i <> j) AndAlso (i <> (j + 1)) Then '相邻位移动只取后移'
Move(i, j)
End If
Next
Next

Console.ReadLine()
End Sub

End Module

01,213456789
02,231456789
03,234156789
04,234516789
05,234561789
06,234567189
07,234567819
08,234567891
09,132456789
10,134256789
11,134526789
12,134562789
13,134567289
14,134567829
15,134567892
16,312456789
17,124356789
18,124536789
19,124563789
20,124567389
21,124567839
22,124567893
23,412356789
24,142356789
25,123546789
26,123564789
27,123567489
28,123567849
29,123567894
30,512346789
31,152346789
32,125346789
33,123465789
34,123467589
35,123467859
36,123467895
37,612345789
38,162345789
39,126345789
40,123645789
41,123457689
42,123457869
43,123457896
44,712345689
45,172345689
46,127345689
47,123745689
48,123475689
49,123456879
50,123456897
51,812345679
52,182345679
53,128345679
54,123845679
55,123485679
56,123458679
57,123456798
58,912345678
59,192345678
60,129345678
61,123945678
62,123495678
63,123459678
64,123456978
拜一刀 2015-03-23
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
[quote=引用 6 楼 zeratul1990 的回复:] 第一位有九种可能,第二位剩下八种可能,第三位.... 结果是9*8*7*6*5*4*3*2*1
任意移动,不是只往后移,还有前移,所以都是n-1[/quote] 只移动一个啊我以为全排列随便移呢orz
  • 打赏
  • 举报
回复
引用 6 楼 zeratul1990 的回复:
第一位有九种可能,第二位剩下八种可能,第三位.... 结果是9*8*7*6*5*4*3*2*1
任意移动,不是只往后移,还有前移,所以都是n-1
拜一刀 2015-03-23
  • 打赏
  • 举报
回复
第一位有九种可能,第二位剩下八种可能,第三位.... 结果是9*8*7*6*5*4*3*2*1
  • 打赏
  • 举报
回复
Sub MoveCom()
        Dim list As List(Of Integer)= New List(Of Integer)
        For i = 0 To 8
            list.Add(i)
        Next
        Dim pAct = Sub(x)
                       Console.Write(x)
                   End Sub
        Dim nAct = Sub(oldIndex As Integer, newIndex As Integer)
                       Dim tmp = list.ToList()
                       tmp.Insert(newIndex, list(oldIndex))
                       tmp.RemoveAt(IIf(oldIndex > newIndex, oldIndex + 1, oldIndex))
                       tmp.ForEach(pAct)
                       Console.WriteLine()
                   End Sub
        For i = 0 To list.Count - 1 Step 1
            For j = i - 1 To 0 Step -1
                nAct(i, j)
            Next j
            For j = i + 2 To list.Count Step 1
                nAct(i, j)
            Next
            Console.WriteLine("Move Finish." + list(i).ToString())
        Next i

    End Sub
不容易啊,还要查了VB语法来写
拜一刀 2015-03-23
  • 打赏
  • 举报
回复
引用 10 楼 txyhj500 的回复:
您说得对。 我的意思是全排列随便移动。 这样的不同排列一共多少。 如何得出呢?
我说的全排列不止移动了一个数啊 比如987654321或者156987432这种组合也有了
  • 打赏
  • 举报
回复
0-8跟1-9有区别??我无语了!代码改下初始化就行了 9个数字的组合跟按位置随便移动一位是完全不一样的概念
txyhj500 2015-03-23
  • 打赏
  • 举报
回复
引用 8 楼 zeratul1990 的回复:
[quote=引用 7 楼 starfd 的回复:] [quote=引用 6 楼 zeratul1990 的回复:] 第一位有九种可能,第二位剩下八种可能,第三位.... 结果是9*8*7*6*5*4*3*2*1
任意移动,不是只往后移,还有前移,所以都是n-1[/quote] 只移动一个啊我以为全排列随便移呢orz[/quote] 您说得对。 我的意思是全排列随便移动。 这样的不同排列一共多少。 如何得出呢?
txyhj500 2015-03-23
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
Sub MoveCom()
        Dim list As List(Of Integer)= New List(Of Integer)
        For i = 0 To 8
            list.Add(i)
        Next
        Dim pAct = Sub(x)
                       Console.Write(x)
                   End Sub
        Dim nAct = Sub(oldIndex As Integer, newIndex As Integer)
                       Dim tmp = list.ToList()
                       tmp.Insert(newIndex, list(oldIndex))
                       tmp.RemoveAt(IIf(oldIndex > newIndex, oldIndex + 1, oldIndex))
                       tmp.ForEach(pAct)
                       Console.WriteLine()
                   End Sub
        For i = 0 To list.Count - 1 Step 1
            For j = i - 1 To 0 Step -1
                nAct(i, j)
            Next j
            For j = i + 2 To list.Count Step 1
                nAct(i, j)
            Next
            Console.WriteLine("Move Finish." + list(i).ToString())
        Next i

    End Sub
不容易啊,还要查了VB语法来写
非常感谢指教! 遗憾的是有些感到失望。 我的需求是每个输出都是9个数字为一组。 例如; 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 3 4 5 6 7 8 9 1 2 这样每个9个号为一组。我认为不同的组合可能是10万个 ?
txyhj500 2015-03-21
  • 打赏
  • 举报
回复
对不起,还是不明白。 哪位能c#改称vb呢
  • 打赏
  • 举报
回复
vb就是把各种声明换成dim而已啊,begin,end啥的
txyhj500 2015-03-21
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
往前移,往后移,每个数字都可以移动N-1次,就是两个循环的事情啊
static void MoveCom()
        {
            List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
            Action<int, int> act = (oldIndex, newIndex) =>
            {
                var tmp = list.ToList();
                tmp.Insert(newIndex, list[oldIndex]);
                tmp.RemoveAt(oldIndex > newIndex ? oldIndex + 1 : oldIndex);
                tmp.ForEach(x =>
                {
                    Console.Write(x);
                });
                Console.WriteLine();
            };
            for (var i = 0; i < list.Count; i++)
            {
                for (var j = i - 1; j >= 0; j--)
                {
                    act(i, j);
                }
                for (var j = i + 2; j <= list.Count; j++)
                {
                    act(i, j);
                }
                Console.WriteLine("Move Finish." + list[i]);
            }
        }
vb中的语法是如何写呢 。我不熟悉c#
  • 打赏
  • 举报
回复
往前移,往后移,每个数字都可以移动N-1次,就是两个循环的事情啊
static void MoveCom()
        {
            List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
            Action<int, int> act = (oldIndex, newIndex) =>
            {
                var tmp = list.ToList();
                tmp.Insert(newIndex, list[oldIndex]);
                tmp.RemoveAt(oldIndex > newIndex ? oldIndex + 1 : oldIndex);
                tmp.ForEach(x =>
                {
                    Console.Write(x);
                });
                Console.WriteLine();
            };
            for (var i = 0; i < list.Count; i++)
            {
                for (var j = i - 1; j >= 0; j--)
                {
                    act(i, j);
                }
                for (var j = i + 2; j <= list.Count; j++)
                {
                    act(i, j);
                }
                Console.WriteLine("Move Finish." + list[i]);
            }
        }

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧