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

[数值计算] [挑战]批处理输出若干个字符或数字的排列组合

字符的排列组合,一般地,n个数字(不重复)的全排列有n!个组合方式。
这个应该好理解,比如三个字符:a b c,那么他的全排列的所有组合方式就是
a b c
a c b
b a c
b c a
c a b
c b a
----------------
现在征集代码,对指输入的n个字符,输出它的全排列

看哪个代码最快
那个代码最短小
  1. @echo off&title 输出任意个字符的排列组合
  2. set/p str=输入字符,并用空格隔开
  3. rem ------------------
  4. rem 你的代码
复制代码
dooooooooo

麻烦发贴前先在论坛搜索下。。。
***共同提高***

TOP

麻烦发贴前先在论坛搜索下。。。
batman 发表于 2011-4-19 12:32


你觉得我没搜索吗?
dooooooooo

TOP

for嵌套...

TOP

for嵌套...
zm900612 发表于 2011-4-19 12:47


我看了那些代码,我的帖子就是要突出“最”字,要不怎么叫“挑战”呢?
dooooooooo

TOP

6# 舒待子
楼主认为这个贴子和你的有什么实质性的区别?标题不同?
http://www.bathome.net/thread-1701-1-4.html
***共同提高***

TOP

***共同提高***

TOP

4# 舒待子


斑竹让你搜索是对的,论坛早就有相关的帖子,浮躁是学不了东西的。

TOP

3楼穷举法,8楼递归法:
http://www.bathome.net/viewthrea ... hlight=%C5%C5%C1%D0
batman 发表于 2011-4-19 13:10


看了两个都是你的代码,一个要生产临时文件,另一个还好,
=======================
题外话,我觉得版主有些“倚老卖老”

你以前讨论过就不许别人再发帖讨论了吗? 排列组合算法五花八门,我发帖为大家提供再交流平台,怎么就浮躁了

尽管我是用马甲帖,也是看这帖太冷清了。
dooooooooo

TOP

这是我最后一贴,此号作废,论坛官僚味十足。
dooooooooo

TOP

=.=
发表对别人的看法的同时,也看看自己。
你可以坚持自己的想法,但不能强迫别人也有兴趣。
不依自己的想法就是"XX主义"?

TOP

不依自己的想法就是"XX主义"!

TOP

早上就看见这个贴子了,还真没想到跟贴的会这么多。上火
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

本帖最后由 plp626 于 2011-5-22 09:34 编辑

这个很短小。
  1. @echo off
  2. call:perm "a b c xy z"
  3. pause
  4. :perm <"c1 c2 ..."> // code by plp
  5. setlocal enabledelayedexpansion&set "s=%~1 "
  6. if "!s: =!" == ""  (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
  7. endlocal&goto:eof
复制代码
这个代码可精简为:
  1. @echo off&setlocal enabledelayedexpansion
  2. call:perm "a b c xy z"
  3. pause
  4. :perm <"c1 c2 ..."> // code by plp
  5. setlocal&set "s=%~1 "&if "!s: =!" == ""  (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
复制代码
依据:
setlocal enabledelayedexpansion后,子过程会自动继承变量延迟开启,
call一个子过程,若setlcoal后,在结束该子过程时默认endlocal。。。
2

评分人数

TOP

本帖最后由 plp626 于 2011-5-22 09:30 编辑

这个兼容特殊字符
  1. @echo off
  2. call:perm "< & > plp |"
  3. pause
  4. :perm <"s1 s2 ...">
  5. setlocal enabledelayedexpansion&set "s= %~1"&for /f "tokens=*" %%a in ("%~1")do Set "ss=%%a"
  6. if "!s: =!" == ""  (echo "%~2 ") else for %%b in ("!ss: =" "!")do call:perm "!s: %%~b=!" "%~2 %%~b"
  7. endlocal&goto:eof
复制代码
这个可精简为:
  1. @echo off&setlocal enabledelayedexpansion
  2. call:perm "< & > plp |"
  3. pause
  4. :perm <"s1 s2 ...">
  5. setlocal&set "s= %~1"&for /f "tokens=*" %%a in ("%~1")do Set "ss=%%a"
  6. if "!s: =!" == ""  (echo "%~2 ") else for %%b in ("!ss: =" "!")do call:perm "!s: %%~b=!" "%~2 %%~b"
复制代码
依据:
setlocal enabledelayedexpansion后,子过程会自动继承变量延迟开启,
call一个子过程,若setlcoal后,在结束该子过程时默认endlocal。。。

TOP

返回列表