日期:2014-05-17  浏览次数:20544 次

有六个数(1、2、2、3、4、5),列出所有组合,4不能在第三位,3与5不相连
如题

------解决方案--------------------
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)
头疼
------解决方案--------------------
回溯