这个算法最好的解决方案:
有1,2,2,3,4,5六个数,要求输出他们组合的全排列,4不能在第三位,5和3不能相邻
有算法学习资料的给出超链接
有1,2,2,3,4,5六个数,要求输出他们组合的全排列,4不能在第三位,5和3不能相邻
有算法学习资料的给出超链接
解决方案 »
- 上班很闲的时候应该怎么样去学习
- MVC的页面布局是怎么回事?
- 求一应用程序和网站的在线编辑器,大恩不言谢阿!!
- 使用什么保存用户设置的问题,cookie还是数据库
- 使用Microsoft.Practices.EnterpriseLibrary.Data怎么访问sqlserver 2000数据库
- datalist 嵌套,子datalist ItemDataBound事件问题
- 如何解决这个出错问题.
- 一个狗血让我心焦的问题。IE9中出现的神奇BUG
- 请问用File field上传图片时,如何才能显示图片
- 求SQL
- 关于父窗体弹出子窗体,然后子窗体关闭,父窗体跳转
- aspnet url重写是否支持框架页
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点扩展:
(1)可以在不变更遍历算法的情况下,简单调整用来排列的元数字(字母)
(2)可以方便地更改找到组合以后的行为,比如修改为输出到asp页面,而不是控制台
(3)可以方便地定义过滤条件
(4)可以在不改变客户端掉用列的元数字、和过滤条件的情况下修改遍历算法(比如性能调整或者将排列改成组合)
基本上能想到的维护情况都考虑到了。