VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 905|回复: 7

穷举算法

[复制链接]

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-19 19:00:01 | 显示全部楼层 |阅读模式
要一个实例
例如输入123
要能得到所有的排列
123,132,213,231,312,321,共有3!=6种
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-28 18:18:01 | 显示全部楼层
把数字分开存在一个数组里,然后进行排列组合的遍历
回复

使用道具 举报

0

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-28 23:54:01 | 显示全部楼层
旋转法产生全排列.
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-1-30 17:27:01 | 显示全部楼层
代码请贴出来,谢谢!
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-1 19:00:02 | 显示全部楼层
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program //计算P(M,N) M=3;N=3
    {
        static int Count=0; //存放排列组合数.
        static void Main(string[] args)
        {
            int M = 3;
            int N = 3;
            int[] a = new int[M];

            for (int i = 1; i <= M; i++) //数组赋初值"1,2,3"
            {
                a[i-1] = i;
            }
            if (M < N)
            {
            }
            else
            {
                getValue(a, 0, N);
                Console.WriteLine(Count);//输出组合数
                Console.Read();
            }

        }

        static void getValue(int[] a, int k, int n)
        {
            int temp;
            if (k >= n) //输出结果:
            {
                string s = "";
                for (int i = 0; i < n; i++)
                {
                    s = s + a[i].ToString() + " ";
                }
                Count++;
                Console.WriteLine(s);
            }
            else
            {
                for (int i = k; i < a.Length; i++)
                {
                    temp = a[i];
                    a[i] = a[k];
                    a[k] = temp;
                    getValue(a, k + 1, n); //递归调用
                    temp = a[k];
                    a[k] = a[i];
                    a[i] = temp;
                }
            }
        }
    }
}
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-2-4 15:45:01 | 显示全部楼层
如果我要加上一个包含1,2位的全排列,比如说1,2,3,12,13,21,31,23,32,等等,那又应该怎么写啊?
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-20 19:30:02 | 显示全部楼层
比如说4个数字1,2,3,4,我要得到的结果的个数是要有A41+A42+A43+A44=64种
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-25 08:30:01 | 显示全部楼层
using System;
using System.Collections;

namespace MyNameSpace
{
    class GenerateWords
    {
        public static void Main()
        {
            string str = "1234";
            ArrayList result = new ArrayList();
            ArrayList kinds = Generate_Permutations1(str);
            for (int i = 0; i < kinds.Count; i++)
            {
                ArrayList res = Generate_Permutations(kinds[i].ToString());
                result.AddRange(res);
            }
            
            Console.WriteLine("Count = " + result.Count);
            for (int i = 0; i < result.Count; i++)
            {
                Console.WriteLine(result[i]);
            }
        }
        public static ArrayList Generate_Permutations(string word)
        {
            ArrayList result = new ArrayList();
            if (word.Length == 1)
            {
                result.Add(word);
                return result;
            }
            for (int i = 0; i < word.Length; i++)
            {
                string shorter_word = word.Substring(0, i) + word.Substring(i + 1, word.Length - i - 1);
                ArrayList shorter_Permutations = Generate_Permutations(shorter_word);
                for (int j = 0; j < shorter_Permutations.Count; j++)
                {
                    string longer_word = word[i].ToString() + shorter_Permutations[j].ToString();
                    result.Add(longer_word);
                }
            }
            return result;
        }

        public static ArrayList Generate_Permutations1(string word)
        {
            ArrayList result = new ArrayList();
            result.Add(word[word.Length - 1]);
            if (word.Length <= 1)
                return result;
            for (int i = word.Length - 2; i >= 0; i--)
            {
                int count = result.Count;
                for (int j = 0; j < count; j++)
                {
                    result.Add(word[i].ToString() + result[j].ToString());
                }
                result.Add(word[i].ToString());
            }
            return result;
        }

    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表