[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-020】批处理根据输入列出组合

如输入a b a


输入 a b c d e a b

写了一个效率很不高到7位的话 就要近50秒
难度是要能处理相同字符组合
贴出就加分
2天后来加分
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

这题的难度好像不在于相同的字符,对我来说,如何排列才是最难的。头疼,排列组合。。。
心绪平和,眼藏静谧。

TOP

楼主的a b a 组合其中有相同的,怎么算组合(排列组合不允许有相同的组合)

[ 本帖最后由 huahua0919 于 2008-9-1 09:55 编辑 ]

TOP

回复 3楼 的帖子

楼主的题目要求是"列出组合",而不是"列出排列组合",因此应该允许重复的字符出现吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 terse 于 2008-9-1 01:36 发表
如输入a b a
274

输入 a b c d e a b
275
写了一个效率很不高到7位的话 就要近50秒
难度是要能处理相同字符组合
贴出就加分
2天后来加分


去掉重复的?对楼主来说会难么?

再其中的输出加上一句.

if not 输出==true (
      set 输出=true
      echo 输出
)

当然这里我更情愿用临时文件的方法来解决。

type 临时文件 | findstr /r "^输出$"
if errorlevel 1 ***

至于程序算法...天啊。.代码太长了。

TOP

原帖由 huahua0919 于 2008-9-1 09:40 发表
楼主的a b a 组合其中有相同的,怎么算组合(排列组合不允许有相同的组合)

可能是我的表述有问题
我的意思是:输入3个字符应该是6种组合  输入4个字符应该是24种组合  输入5个字符应该是120种组合
不管输入有无重复字符 也就是如果输入a a a a a 就要输出120行 a a a a a 实际上最后一行的第一位并不一定是第一排的第一位的a
这样的表述是否清楚?
下面是个效率不错的组合输出:但输入的组合不能有重复字符 而且是固定位数
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=a b c d c d e f
  3. for %%i in (!var!) do (
  4.     set var1=!var:%%i=!
  5.     for %%j in (!var1!) do (
  6.     set var2=!var1:%%j=!
  7.     for %%k in (!var2!) do (
  8.     set var3=!var2:%%k=!
  9.     for %%l in (!var3!) do (
  10.     set var4=!var3:%%l=!
  11.     for %%m in (!var4!) do (
  12.     set var5=!var4:%%m=!
  13.     for %%n in (!var5!) do (
  14.     set var6=!var5:%%n=!
  15.     set/a flag+=1
  16.     echo %%i %%j %%k %%l %%m %%n !var6: =!
  17.     ))))))
  18.     echo 共有%flag%个组合
  19. pause
复制代码

[ 本帖最后由 terse 于 2008-9-2 16:12 编辑 ]

TOP

有重复字符很简单啊。
  1. set var=a b c a b
  2. for %%a in (%var%) do set/a nn+=1&set .!nn!=%%a
  3. for /l %%a in (1 1 %nn%) do set "str=!str!%%a "
  4. for %%i in (!str!) do (
  5. ....
  6. ....
  7. echo !.%%i! !.%%j! !.%%k! !.%%l! !.%%m!
复制代码
心绪平和,眼藏静谧。

TOP

原帖由 pusofalse 于 2008-9-2 16:17 发表
有重复字符很简单啊。set var=a b c a b
for %%a in (%var%) do set/a nn+=1&set .!nn!=%%a
for /l %%a in (1 1 %nn%) do set "str=!str!%%a "
for %%i in (!str!) do (
....
....
echo !.%%i! !.%%j! !.%%k ...

啊?不会吧!
你的%%j  %%k 是预先写入的?前面虽然得到位数但 并没表示到%%K吧

TOP

回复 8楼 的帖子

  1. @echo off&setlocal enabledelayedexpansion
  2. set str=a b a
  3. for %%a in (%str%) do set /a n+=1& set .!n!=%%a&set "var=!var!!n! "
  4. for %%i in (!var!) do (
  5.     set var1=!var:%%i=!
  6.     for %%j in (!var1!) do (
  7.     set var2=!var1:%%j=!
  8.     for %%k in (!var2!) do (
  9.     set/a flag+=1
  10.     echo !.%%i! !.%%j! !.%%k!
  11.     )))
  12.     echo 共有%flag%个组合
  13. pause
复制代码
1

评分人数

    • terse: 加分在那里PB + 5
心绪平和,眼藏静谧。

TOP

一直觉得穷举法不是批处理的强项,尤其是在不知道有多少位数字或字母的情况下,更是难
以写出通用的代码,本人以前写过一个适用于9位内数字或字母排列的代码,实际上到了8位
就已经达到了效率的极限了。。。
***共同提高***

TOP

原帖由 pusofalse 于 2008-9-2 16:49 发表
@echo off&setlocal enabledelayedexpansion
set str=a b a
for %%a in (%str%) do set /a n+=1& set .!n!=%%a&set "var=!var!!n! "
for %%i in (!var!) do (
    set var1=!var:%%i=!
    for %%j in (!var1!) ...

输入4位  输出时少了一位
确切的是输入3位数上 输出仍输出3位
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

原帖由 batman 于 2008-9-2 17:00 发表
一直觉得穷举法不是批处理的强项,尤其是在不知道有多少位数字或字母的情况下,更是难
以写出通用的代码,本人以前写过一个适用于9位内数字或字母排列的代码,实际上到了8位
就已经达到了效率的极限了。。。

穷举法确实不是批处理的强项  即便出一个通用的代码 也是效率的代价

TOP

这样的题用递归来做比较好些,否则用我这样的方法,还是一样只是穷举,而且不通用,太臃肿,4个字符只能再加一个for,若有5个字符就得用5个for。
完全是不通用的。
心绪平和,眼藏静谧。

TOP

抛个砖  这样的处理效率肯定不是很高  后来者突破吧
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p str=请输入(空格隔开)
  3. for %%i in (!str!) do set/a n+=1&set !n!=%%i
  4.     call:lp
  5.     echo %mn% 个组合
  6.     pause&exit
  7. :lp
  8. set/a m+=1
  9.     if %m% leq %n% for /l %%i in (1 1 %n%) do (
  10.     for %%j in (%~1) do set .%%j=%%j
  11.     if not defined .%%i call :lp "%~1 %%i"
  12.     for /l %%k in (1 1 %n%) do set .%%k=
  13.     ) else (
  14.     for /l %%l in (1 1 %n%) do set .%%l=
  15.     for %%m in (%~1) do set/p=!%%m! <nul
  16.     echo.
  17.     set/a mn+=1
  18.     )
  19.     set/a m-=1
复制代码
1

评分人数

TOP

哈哈 可以用来做概率题

TOP

返回列表