c# 排列组合代码类
- /// <summary>
- /// 排列组件算法类
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class PermutationAndCombination<T>
- {
- /// <summary>
- /// 交换两个变量
- /// </summary>
- /// <param name="a">变量1</param>
- /// <param name="b">变量2</param>
- public static void Swap(ref T a, ref T b)
- {
- T temp = a;
- a = b;
- b = temp;
- }
- /// <summary>
- /// 递归算法求数组的组合(私有成员)
- /// </summary>
- /// <param name="list">返回的范型</param>
- /// <param name="t">所求数组</param>
- /// <param name="n">辅助变量</param>
- /// <param name="m">辅助变量</param>
- /// <param name="b">辅助数组</param>
- /// <param name="M">辅助变量M</param>
- private static void GetCombination(ref List<T[]> list, T[] t, int n, int m, int[] b, int M)
- {
- for (int i = n; i >= m; i--)
- {
- b[m - ] = i - ;
- if (m > )
- {
- GetCombination(ref list, t, i - , m - , b, M);
- }
- else
- {
- if (list == null)
- {
- list = new List<T[]>();
- }
- T[] temp = new T[M];
- for (int j = ; j < b.Length; j++)
- {
- temp[j] = t[b[j]];
- }
- list.Add(temp);
- }
- }
- }
- /// <summary>
- /// 递归算法求排列(私有成员)
- /// </summary>
- /// <param name="list">返回的列表</param>
- /// <param name="t">所求数组</param>
- /// <param name="startIndex">起始标号</param>
- /// <param name="endIndex">结束标号</param>
- private static void GetPermutation(ref List<T[]> list, T[] t, int startIndex, int endIndex)
- {
- if (startIndex == endIndex)
- {
- if (list == null)
- {
- list = new List<T[]>();
- }
- T[] temp = new T[t.Length];
- t.CopyTo(temp, );
- list.Add(temp);
- }
- else
- {
- for (int i = startIndex; i <= endIndex; i++)
- {
- Swap(ref t[startIndex], ref t[i]);
- GetPermutation(ref list, t, startIndex + , endIndex);
- Swap(ref t[startIndex], ref t[i]);
- }
- }
- }
- /// <summary>
- /// 求从起始标号到结束标号的排列,其余元素不变
- /// </summary>
- /// <param name="t">所求数组</param>
- /// <param name="startIndex">起始标号</param>
- /// <param name="endIndex">结束标号</param>
- /// <returns>从起始标号到结束标号排列的范型</returns>
- public static List<T[]> GetPermutation(T[] t, int startIndex, int endIndex)
- {
- if (startIndex < || endIndex > t.Length - )
- {
- return null;
- }
- List<T[]> list = new List<T[]>();
- GetPermutation(ref list, t, startIndex, endIndex);
- return list;
- }
- /// <summary>
- /// 返回数组所有元素的全排列
- /// </summary>
- /// <param name="t">所求数组</param>
- /// <returns>全排列的范型</returns>
- public static List<T[]> GetPermutation(T[] t)
- {
- return GetPermutation(t, , t.Length - );
- }
- /// <summary>
- /// 求数组中n个元素的排列
- /// </summary>
- /// <param name="t">所求数组</param>
- /// <param name="n">元素个数</param>
- /// <returns>数组中n个元素的排列</returns>
- public static List<T[]> GetPermutation(T[] t, int n)
- {
- if (n > t.Length)
- {
- return null;
- }
- List<T[]> list = new List<T[]>();
- List<T[]> c = GetCombination(t, n);
- for (int i = ; i < c.Count; i++)
- {
- List<T[]> l = new List<T[]>();
- GetPermutation(ref l, c[i], , n - );
- list.AddRange(l);
- }
- return list;
- }
- /// <summary>
- /// 求数组中n个元素的组合
- /// </summary>
- /// <param name="t">所求数组</param>
- /// <param name="n">元素个数</param>
- /// <returns>数组中n个元素的组合的范型</returns>
- public static List<T[]> GetCombination(T[] t, int n)
- {
- if (t.Length < n)
- {
- return null;
- }
- int[] temp = new int[n];
- List<T[]> list = new List<T[]>();
- GetCombination(ref list, t, t.Length, n, temp, n);
- return list;
- }
- }
枚举出键盘所有组合键代码:
- var combinePrefixKeyList = new Keys[] { Keys.Control, Keys.Alt, Keys.Shift };
- var result = new List<List<Keys>>();
- for(var i = ;i <= combinePrefixKeyList.Count() ;i++)
- {
- var combinationList = PermutationAndCombination<Keys>.GetCombination(combinePrefixKeyList, i);
- var items = combinationList.Select(item => item.ToList()).ToList();
- result.AddRange(items);
- }
- var keyNames = Enum.GetNames(typeof(Keys)).ToList();
- foreach (var keyName in keyNames)
- KeyList.Add(keyName, (Keys)Enum.Parse(typeof(Keys), keyName));
- var combineKeyList = (from item in result
- join key in KeyList.Select(k => k.Value).Except(new List<Keys> { Keys.None })
- on true equals true
- select item.Concat<Keys>(new List<Keys> { key })
- ).ToList();
- Func<List<int>, int> GetCombinedKeyCode = null;
- GetCombinedKeyCode = delegate(List<int> args)
- {
- if (args.Count == )
- return ;
- if (args.Count == )
- return args[];
- return args[] | GetCombinedKeyCode(args.Skip().ToList());
- };
- Func<int, int> GetVirtualKeyCode = delegate(int args)
- {
- return (byte)(args & 0xFF);
- };
- foreach (var item in combineKeyList)
- {
- var names = item.Select(key => Enum.GetName(typeof(Keys), key));
- var keyCombination = string.Join("+", names);
- Debug.Print(keyCombination + ":\t" + GetVirtualKeyCode(GetCombinedKeyCode(item.Cast<int>().ToList())).ToString());
- }
c# 排列组合代码类的更多相关文章
- php实现排列组合
php实现排列组合 一.总结 1.回溯:回溯的函数参数有些生疏了,记录递归的位置(pos或step),还要有东西(vis数组)来记录这个是否已经被访问 2.php全局变量的使用 :外部定义的普通变量, ...
- C#的排列组合类
C#的排列组合类 //-----------------------------------------------------------------------------//// 算法:排列组合 ...
- C#排列组合类
//----------------------------------------------------------------------------- // // 算法:排列组合类 // // ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)
Machine scheduling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- [总结]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...
- 数组排列组合问题——BACKTRACKING
BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...
随机推荐
- Qualcomm_Mobile_OpenCL.pdf 翻译-9-OpenCL优化用例的学习
在这一章中,将会用一些例子来展示如何使用之前章节中讨论的技术来进行优化.除了一些小的简单代码片段的展示外,还有两个熟知的图像滤波处理,Epsilon滤波和Sobel滤波,将会使用之前章节中讨论的方法进 ...
- RMQ 2d 模板
#include<iostream> #include<cstdio> #include<string.h> #include<string> #inc ...
- 如何创建DLL,以及注入DLL
为了防止忘记,特记下 DLL的创建,在VS2017中选择dll的创建 // dllmain.cpp : Defines the entry point for the DLL application. ...
- 第四篇:存储库之mongodb、redis、mysql
MongoDB的简单操作 一.简介 二.MongoDB基础知识 三.安装 四.基本数据类型 五.增删改查操作 六.可视化工具 七.pymongo 一.简介 MongoDB是一款强大.灵活.且易于扩展的 ...
- form表单和CSS
一.form表单 1. form表单有什么用 能够获取用户输入的信息(输入,选择, 上传的文件),并且将这些数据全部发送给后端 2. form表单的用法 (1)有两个重要参数: action : 控制 ...
- set uniion()
union()方法返回两个集合的并集,包含所有集合的元素,重复元素只会出现一次. 语法: set.union(set1,set2) 参数: set1必填参数,合并的目标集合 set2选填参数,其他要合 ...
- POJ-3020-Antena Placement(最小路径覆盖)
链接: https://vjudge.net/problem/POJ-3020 题意: The Global Aerial Research Centre has been allotted the ...
- 设计模式Design Pattern(4) -- 访问者模式
什么是访问者模式? 一个对象有稳定的数据结构,却为不同的访问者提供不同的数据操作,对象提供接收访问者的方法,从而保证数据结构的稳定性和操作的多样性.也可以理解为,封装对象的操作方法,达到不改变对象数据 ...
- 解决SonarQube启动时直接挂掉问题
症状:启动SonarQube时,系统启动,但是马上关闭 查看日志,提示ElasticSearch启动有问题ClusterBlockException[blocked by: [FORBIDDEN/12 ...
- jvm——内存模型
这是我理解的jvm内存模型,这一整块可以简单理解为虚拟内存空间: jvm代码.jvm数据:是运行jvm所用到的代码和数据,并不是我们自己编程得到的代码和数据 direct memory:主要是NIO在 ...