| 关键词: nbsp return nLevel then nCount end value List 字符串 next |
对 N 组 字符串无重复全排列的算法 要点:函数采用递归形式,理论上做到对任意 N 进行全排列 0<N<257; 每组字符数不限; 可以进行 N 选 X 形式的全排列(0<X<N+1) 函数参数:as_value[] string value 存放需要全排列的字符串; as_nLevel int value N - X ; as_char string value 字符串排列起来用于分隔的字符; as_allowrepeat boolean value 全排列允许重复,取值含义: true: 允许全排列重复 false:全排列不允许重复 as_value不存在重复元素也取值true,提高效率; as_list[256] int reference 函数工作用的内部数组; as_return[] string reference 存放生成的全排列字符串。 调用详解:1.必须定义的变量 string as_return[];int as_list[256] 2.as_return,as_list切勿赋值 3.把需要排列的 N 组字符或字符串赋值给as_value[] 4.as_char,用来定义分隔生成的字符串的字符,不需要分隔就不用赋值 5.as_nLevel=N - X 5.调用本函数f_string_compages(as_value,as_nLevel,as_char,as_allowrepeat,as_list,as_return) 6.as_return[]就是生成的全排列的字符串序列 特殊调用:要求函数返回 N 全排列的所有方案,即自然数系列的全排列, 设N=4,返回1 2 3 4、1 3 2 4、1 4 3 2........... 调用格式如下:f_string_compages({'N=4'},as_nLevel,as_char,true,as_list,as_return) 即赋值as_value数组第一个元素为字符串:'N=4' 返回代码:0 成功 -1 N>256 或 N<1 -2 X<0 或 X>N N 选 X 全排列的估算: N=X 全排列为 N! 0<x<N 全排列为 N!/(N-X)! 实际使用代码演示: //对'AB','01','05','21','17','09'进行6选4的全排列 string as_return[] int as_list[256] f_string_compages({'AB','01','05','21','17','09'},6 -4,' ',true,as_list,as_return) //接下去是对数组as_return[]进行处理,输出、打印........ //程序略 ========================================*/ // [email protected] 2003-06-05 int nCount,nJudge,key,num,nCount1 long l,i,k,t string s num=upperbound(as_value) if num<1 or num>256 then return -1 if pos(upper(as_value[1]),'N=')<>0 then num=integer(mid(as_value[1],pos(upper(as_value[1]),'N=')+2,100)) if num<1 or num>256 then return -1 end if if as_nLevel<0 or as_nlevel>num then return -2 as_nLevel++ if(as_nLevel>NUM) then //求得一种组合形式 l=upperbound(as_return) l++ s='' for nCount=1 to NUM //进行字符串排列 if as_List[nCount]<>0 then if pos(upper(as_value[1]),'N=')=0 then s=s+as_value[as_List[nCount]+as_char else s=s+string(as_List[nCount])+as_char end if end if next s=left(s,len(s) -1) t=0 if as_allowrepeat=false then //寻找重复的字符串组合 k=upperbound(as_return) for i=1 to k if as_return=s then t=1 exit end if next end if //寻找end if t=0 then as_return[l]=s as_nLevel -- return as_nLevel end if for nCount=1 to NUM key=0; for nJudge=1 to as_nLevel -1 if nCount=as_List[nJudge] then key=1 exit end if next if key=0 then as_List[as_nLevel]=nCount as_nLevel=f_string_compages(as_value,as_nLevel,as_char,as_allowrepeat,as_List,as_return) end if next as_nLevel -- return as_nLevel |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|