如题
------解决方案--------------------------------------------------------
6个数的排列数 减 (5个数的排列数+ 2*5个数的排列数)
加 2*4个数的排列数
1. 6个数的排列数表示6个数字全排得到一个数字假设为A66;
2. 5个数的排列数表示第3位被数字4点位后,剩下的5个数的排列数,假设为A45;
3. 2*5个数的排列数表示,3和5相连有两个情况,35和53,此时35或53表示一位数,与剩下的4位进行排列,假设结果为A35;
4. 由于2跟3两种情况有重复的,所以要加上2和3里重复的;重复部分为4占了第3位后,35或53与剩下的3位数字的全排列,假设结果命令为A23;
5. 那么结果就是 A66-A45-A35+A23;
不知道这样对不对。希望能帮到楼主
------解决方案--------------------------------------------------------
- C# code
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { List<int> source = new List<int>() { 1, 2, 2, 3, 4, 5 }; var query = source.Arrange().Where(x => x[2] != 4 && !string.Join("", x.ToArray()).Contains("35") && !string.Join("", x.ToArray()).Contains("53")); foreach (var item in query) { Console.WriteLine(string.Join(", ", item.ToArray())); } } } static class ArrangeHelper { private static List<List<int>> Arrange(int n) { var result = Enumerable.Range(0, n).Select(x => new List<int>() { x }).ToList(); while (result[0].Count < n) { result = result.SelectMany(x => Enumerable.Range(0, n).Except(x).Select(y => x.Concat(new List<int>() { y }).ToList())).ToList(); } return result; } public static IEnumerable<List<T>> Arrange<T>(this List<T> source) { return Arrange(source.Count).Select(x => x.Select(y => source[y]).ToList()); } }}
------解决方案--------------------------------------------------------
如果求数目
A66 / 2 - 60 - A55(5/6)
------解决方案--------------------------------------------------------
算错了 -A55(4/6)
头疼
------解决方案--------------------------------------------------------
回溯