组合数获取算法

跟据提供的不重复数组,获取其中包含的组合数:

 /*
          组合算法   
          本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标   
          代表的数被选中,为0则没选中。     
          首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。     
          然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为   
          “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。     
          当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得   
          到了最后一个组合。     
          例如求5中选3的组合:     
          1   1   1   0   0   //1,2,3     
          1   1   0   1   0   //1,2,4     
          1   0   1   1   0   //1,3,4     
          0   1   1   1   0   //2,3,4     
          1   1   0   0   1   //1,2,5     
          1   0   1   0   1   //1,3,5     
          0   1   1   0   1   //2,3,5     
          1   0   0   1   1   //1,4,5     
          0   1   0   1   1   //2,4,5     
          0   0   1   1   1   //3,4,5   
         */
        ArrayList ResaultAll = new ArrayList();
        int SXcount = 0;
        int SWCZ = 0;
        private void btn_GetAll_Click(object sender, EventArgs e)
        {
            try
            {
                int[] SourceArrIndex = new int[15] { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                int[] SourceArrNumber = new int[15] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };


                //先清空数据
                this.dataGridView1.Rows.Clear();
                ResaultAll.Clear();
                this.textBox1.Text = "";
                while (CheckSourceArrIndex(SourceArrIndex) == false)
                {
                    int j = 0;
                    int[] Resault = new int[5];
                    //一轮处理
                    for (int i = 0; i < SourceArrIndex.Length; i++)
                    {
                        if (SourceArrIndex[i] == 1)
                        {
                            Resault[j] = SourceArrNumber[i];
                            j++;
                        }
                    }
                    ResaultAll.Add(Resault);
                    //一轮处理结束
                    //处理SourceArrIndex
                    ProcessSourceArrIndex(ref SourceArrIndex);
                }
                //添加最后一条数据,也就是当最后5个为1时的数组
                int[] LastResault = new int[5] { 11, 12, 13, 14, 15 };
                ResaultAll.Add(LastResault);

                //绑定数据到gridview
                BindData(ResaultAll);
                textBox2.Text = ResaultAll.Count.ToString();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message );
            }
        }
        private void ProcessSourceArrIndex(ref int[] SourceArrIndex)
        {
            try
            {
                int x = 0;
                for (int i = 0; i < SourceArrIndex.Length; i++)
                {
                    if (i != SourceArrIndex.Length - 1 && SourceArrIndex[i] == 1)
                    {
                        //只处理第一个10
                        if (SourceArrIndex[i + 1] == 0)
                        {
                            //交换
                            SourceArrIndex[i] = 0;
                            SourceArrIndex[i + 1] = 1;
                            //左移
                            for (int j = 0; j <= i; j++)
                            {
                                if (SourceArrIndex[j] == 1)
                                {
                                    //如果为1, 则设置为0,并且将前面的第X个元素设置为1
                                    SourceArrIndex[j] = 0;
                                    SourceArrIndex[x] = 1;
                                    x++;
                                }
                            }
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private bool CheckSourceArrIndex(int[] SourceArrIndex)
        {
            if (SourceArrIndex[SourceArrIndex.Length - 1] == 1 && SourceArrIndex[SourceArrIndex.Length - 2] == 1 && SourceArrIndex[SourceArrIndex.Length - 3] == 1 && SourceArrIndex[SourceArrIndex.Length - 4] == 1 && SourceArrIndex[SourceArrIndex.Length - 5] == 1)
            {
                return true;
            }
            return false;
        }

 

转载于:https://www.cnblogs.com/tylertang/p/3214364.html

8位数组合方式算法是指将一个由8个数字组成的数组,按照一定的规则进行排列组合,以获取所有可能的组合方式。对于这样的算法,在.NET平台上可以使用递归或循环的方式来实现。 一种常见的实现算法是使用递归。具体步骤如下: 1. 首先定义一个递归函数,接收原始数组、当前位置、已经排列好的部分组合和一个标志数组作为参数。 2. 在递归函数中,首先判断当前位置是否已经到达数组的末尾。如果是,则将当前排列的组合添加到一个结果列表中,并返回。 3. 若当前位置还没有到达末尾,则循环遍历原始数组,并判断标志数组中对应位置的元素是否为0。如果为0,表示该数字还没有被使用过,可以选择作为当前位置的元素。 4. 如果标志数组对应位置的元素为0,将其设为1,代表该数字已经被使用过。然后将当前位置的元素添加到已排列好的部分组合中。 5. 调用递归函数,将位置后移一位,求解后续的组合方式。 6. 将标志数组对应位置的元素设为0,以进行下一轮循环。 7. 递归函数返回后,将已排列好的部分组合还原到原始状态,以便进行下一轮循环。 通过上述步骤的递归调用,可以得到所有可能的8位数组合方式。 除了递归算法,我们也可以使用循环的方式来实现8位数组合。基本思想是使用多层循环,通过设置不同的起始位置和循环的终止条件来生成所有可能的组合方式。在循环的过程中,可以利用辅助数据结构(如栈)来保存每一层的部分组合,以便后续的拼接和输出。 总之,无论是使用递归还是循环,8位数组合方式算法的关键是遍历数组元素,记录已使用的元素,并对剩余的元素进行递归或迭代处理。通过这种方式,可以得到所有可能的组合方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值