请教一个排列的数组实现方式?
有n个数,对于每一个数都只能取1或者0,一共有2^n(2的n次方)的排列形式,请教这个矩阵如何写?
结果应该是:假设n=3
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
如何写这个矩阵存放到数组a(2^n-1,2)??
谢谢~~
[解决办法]
- C# code
void Main(){ var list=new int[]{1,0}; var result=(from a in list from b in list from c in list select a+" "+b+" "+c).Distinct(); result.ToList().ForEach(r=>Console.WriteLine(r)); /* 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 */}
[解决办法]
仔细看N=3的数组,你会发现这数组与二进制有关系。即,
把每一行当成一个正整数的二进制,则,
第一行等于0,第二行等于1,第二行等于2。。。。
所以:我给出如下代码,窗体上加BUTTON1、TEXTBOX2、TEXTBOX3三个控件,TEXTBOX3设成多行的。
- VB.NET code
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click buildN(Val(TextBox2.Text), TextBox3) End Sub Private Sub buildN(ByVal n As Integer, ByVal mytext As TextBox) mytext.Text = "" Dim i As Integer, aa As String = "" Dim j As Integer, bb As String = "" Dim k As Integer = 0 Dim a(2 ^ n - 1, n - 1) As String For i = 0 To (2 ^ n - 1) aa = "" aa = Change10JZ(i) bb = "" If Len(aa) < n Then For j = 0 To n - Len(aa) - 1 bb &= "0" Next End If Dim s As String = bb & aa For k = 0 To n - 1 a(i, k) = s.Substring(k, 1) mytext.Text &= a(i, k) Next mytext.Text &= vbCrLf Next End Sub Private Function Change10JZ(ByVal a As Integer) As String '把一个10进制数转成2进制 Dim jg As String = "" Do Until (a < 2) jg += (a Mod 2).ToString a = a \ 2 Loop jg += a.ToString Change10JZ = "" Dim i As Integer For i = Len(jg) - 1 To 0 Step -1 If jg.Substring(i, 1) <> " " Then Change10JZ += jg.Substring(i, 1) Next Return Change10JZ End Function