标题: [已结]对变量进行组合显示的问题
[打印本页]
作者: Hanyeguxing
时间: 2009-7-4 13:34
标题: [已结]对变量进行组合显示的问题
说明:要求讨论组合的可能情况,而不是排列的情况!
例如 set hanye=寒 夜 孤 星,那么变量中这四个字,每个字与其他字组合,不限制组合的字数(即可以单字)有多少种组合呢?
要求输出如下效果:
寒
夜
孤
星
寒夜
寒孤
寒星
夜孤
夜星
孤星
寒夜孤
寒夜星
寒孤星
夜孤星
寒夜孤星
15种组合方法
请按任意键继续...
如何输出或显示出符合条件的情况呢?
[
Last edited by Hanyeguxing on 2009-7-5 at 09:07 ]
作者: moniuming
时间: 2009-7-4 14:01
看看这里如何?
http://www.cn-dos.net/forum/view ... ghlight=&page=1
作者: Hanyeguxing
时间: 2009-7-4 17:59
折腾一晚上,竟然给我输出:
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=495, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
睡觉去了。。。
作者: netbenton
时间: 2009-7-5 03:24
是不是要做成这样呢?
根据
2楼 链接,学习后,再变通得来的。
@echo off&setlocal enabledelayedexpansion
set in=寒夜孤星
set /p in=输入字符串
set m=0
set svr=abcdefghijklmnopqrstuvwxyz
:rep
if "!in:~%m%,1!" neq "" (set s0=!s0! !in:~%m%,1! &set/a m+=1&goto :rep)
set n=0
for %%a in (!s0!) do (
for %%b in (!n!) do (
set /a n+=1
set "coe1=!coe1!for %%!svr:~%%b,1! in (^!s%%b^!) do (set s!n!=^!s%%b:%%!svr:~%%b,1!=^!^&"
set "coe2=!coe2!%%!svr:~%%b,1!"
set "coe3=!coe3!)"
set doe1%%b=!coe1:~,-16!
set doe2%%b=!coe2!
set doe3%%b=!coe3!
)
)
set n=0
:loop
set coe1=!doe1%n%!
set coe2=!doe2%n%!
set coe3=!doe3%n%!
::动态代码
%coe1%
echo %coe2%
%coe3%
::动态代码
set/a n+=1
pause
if !n! neq !m! goto loop
[
Last edited by netbenton on 2009-7-5 at 01:27 ]
作者: Hanyeguxing
时间: 2009-7-5 03:50
感谢楼上的朋友。
2楼给出的链接做出的是
排列 的情况,而我需要的是
组合 的情况。
对于组合来说,“寒夜孤星”与“寒夜星孤”是一样的情况,虽然对于排列来说,他们是不同的。所以,排列后,需要再过滤。。。即过滤掉所有使用相同汉字(相同元素)的情况。
顺便庆祝一下,自己终于可以给别人加4分了,哈哈
作者: Hanyeguxing
时间: 2009-7-5 04:08
一般的想法,列出所有排列的可能,再过滤得到组合的情况。
按照我在1楼给出的要求,则可能的排列组合数:(
n为变量中的字数)
对于组合:
Σ(n)=2(n-1)+2(1)+2(2)+2(3)+......+2(n) 说明:本式中,()内的数值为 2 的指数。
即:
Σ(n)=2(n)-1 说明:本式中,()内的数值为 2 的指数。
对于排列:
Σ(n)=n+
n*(n-1)+
n*(n-1)*(n-2)+
n*(n-1)*(n-2)*(n-3)+
n*(n-1)*(n-2)*(n-3)*(n-4)+
n*(n-1)*(n-2)*(n-3)*(n-4)*(n-5)+
......
n*(n-1)*(n-2)*(n-3)*(n-4)*(n-5)*......*3+
n*(n-1)*(n-2)*(n-3)*(n-4)*(n-5)*......*3*2+
n*(n-1)*(n-2)*(n-3)*(n-4)*(n-5)*......*3*2*1
当只有四个汉字时,即
n=4 ,则排列数是
64 ,组合数是
15 ,随着 n 的增大,组合数成代数增长,而排列数则在成几何增长。
例如当 n=
10 时,组合数是
1023 ,排列数为
9183700 ,这是一个近千万的天文数字。再从
9183700 种排列情况中过滤得到符合条件
1023 种组合的情况,是件很恐怖的事情。。。
于是,我有了这样一个想法,能不能不使用“先排列再过滤”的方法呢?
[
Last edited by Hanyeguxing on 2009-7-5 at 08:15 ]
作者: netbenton
时间: 2009-7-5 08:42
原来两年前已经有前辈把这个问题完美解决了!
http://www.cn-dos.net/forum/viewthread.php?tid=26180###
作者: Hanyeguxing
时间: 2009-7-5 09:05
惭愧。。。
自己琢磨两天了,也没弄好。。。
看了15楼的代码,汗颜啊,这就是差距,也是努力的方向。。。