Board logo

标题: [已结]对变量进行组合显示的问题 [打印本页]

作者: 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楼的代码,汗颜啊,这就是差距,也是努力的方向。。。