找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 106542|回复: 36

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

[复制链接]
发表于 2008-9-1 01:36:50 | 显示全部楼层 |阅读模式
如输入a b a


输入 a b c d e a b

写了一个效率很不高到7位的话 就要近50秒
难度是要能处理相同字符组合
贴出就加分
2天后来加分
发表于 2008-9-1 02:07:10 | 显示全部楼层
这题的难度好像不在于相同的字符,对我来说,如何排列才是最难的。头疼,排列组合。。。
发表于 2008-9-1 09:40:33 | 显示全部楼层
楼主的a b a 组合其中有相同的,怎么算组合(排列组合不允许有相同的组合)

[ 本帖最后由 huahua0919 于 2008-9-1 09:55 编辑 ]
发表于 2008-9-1 10:07:36 | 显示全部楼层

回复 3楼 的帖子

楼主的题目要求是"列出组合",而不是"列出排列组合",因此应该允许重复的字符出现吧。
发表于 2008-9-1 23:39:37 | 显示全部楼层
原帖由 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 ***

至于程序算法...天啊。.代码太长了。
 楼主| 发表于 2008-9-2 16:11:18 | 显示全部楼层
原帖由 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 编辑 ]
发表于 2008-9-2 16:17:25 | 显示全部楼层
有重复字符很简单啊。
  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!
复制代码
 楼主| 发表于 2008-9-2 16:36:59 | 显示全部楼层
原帖由 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吧
发表于 2008-9-2 16:49:48 | 显示全部楼层

回复 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
复制代码

评分

参与人数 1PB +5 收起 理由
terse + 5 加分在那里

查看全部评分

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

穷举法确实不是批处理的强项  即便出一个通用的代码 也是效率的代价
发表于 2008-9-2 17:26:51 | 显示全部楼层
这样的题用递归来做比较好些,否则用我这样的方法,还是一样只是穷举,而且不通用,太臃肿,4个字符只能再加一个for,若有5个字符就得用5个for。
完全是不通用的。
 楼主| 发表于 2008-9-3 23:33:17 | 显示全部楼层
抛个砖  这样的处理效率肯定不是很高  后来者突破吧
  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
复制代码

评分

参与人数 1PB +10 收起 理由
pusofalse + 10 精品文章

查看全部评分

发表于 2008-9-6 10:15:43 | 显示全部楼层
哈哈 可以用来做概率题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 19:16 , Processed in 0.021574 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表