这个算法最好的解决方案:
有1,2,2,3,4,5六个数,要求输出他们组合的全排列,4不能在第三位,5和3不能相邻
有算法学习资料的给出超链接

解决方案 »

  1.   

    我先写一个迭代器的。期待wuyazhe给更好的。
      

  2.   

    http://topic.csdn.net/u/20090217/21/f41ed9f6-f929-451c-a5c9-80d2e408422a.html
      

  3.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                ArrangeChars ac = new ArrangeChars(new char[]{'1', '2', '3', '4', '5'});
                ac.BuildString(s => Console.WriteLine(s),
                    delegate(string s) {
                        return s.IndexOf("53") == -1 && s.IndexOf("35") == -1 && s.IndexOf("4") != 2; 
                    });
            }
        }    public class ArrangeChars
        {
            public delegate void OnFindString(string s);        public delegate bool AcceptString(string s);        private char[] MetaChars { get; set; }        public ArrangeChars(char[] metachars)
            {
                MetaChars = metachars;
            }        public void BuildString(OnFindString ofs, AcceptString astr)
            {
                BuildString("", ofs, astr);
            }        public void BuildString(OnFindString ofs)
            {
                BuildString(ofs, s => true);
            }        private void BuildString(string Prefix, OnFindString ofs, AcceptString astr)
            {
                if (Prefix.Length < MetaChars.GetLength(0))
                {
                    foreach (char c in MetaChars)
                        if (Prefix.IndexOf(c) == -1) BuildString(Prefix + c.ToString(), ofs, astr);
                }
                else
                {
                    if (astr(Prefix)) ofs(Prefix);
                }
            }
        }
    }
      

  4.   

    因为 yield 是编译器魔术,所以不能放入 lambda 表达式,比较麻烦,所以没有搞迭代器。这个代码也没有对重复传入字符作判断,这些LZ自己完善吧。
      

  5.   

    caozhy写的很好了。不过估计楼主看不懂……
      

  6.   

    谢谢wuyazhe兄指点。我的代码谈不上效率多高,但是就lz的应用而言,性能是绝对足够的。
    我的代码考虑了4点扩展:
    (1)可以在不变更遍历算法的情况下,简单调整用来排列的元数字(字母)
    (2)可以方便地更改找到组合以后的行为,比如修改为输出到asp页面,而不是控制台
    (3)可以方便地定义过滤条件
    (4)可以在不改变客户端掉用列的元数字、和过滤条件的情况下修改遍历算法(比如性能调整或者将排列改成组合)
    基本上能想到的维护情况都考虑到了。