免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8321 | 回复: 52
打印 上一主题 下一主题

排列组合问题 [复制链接]

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-31 09:43 |只看该作者 |倒序浏览
本帖最后由 rdcwayx 于 2010-03-29 12:18 编辑

我想在任意给出的7 个字母(任意的26个英语字母,比如 a c r d m a g),里面任意选择6个或者7个组成不重复的所有排列组合。

其中给出的字母可以有重复。

更新: 看第六页,有个总结.

jumble游戏 在51楼
WordScrimmage游戏在52楼

论坛徽章:
0
2 [报告]
发表于 2007-03-31 11:11 |只看该作者
先解决排列问题:  编译后用法 echo "yourstring" | mytool, 可以循环排出,直至返回空。



  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>

  5. int main()
  6. {
  7.   using namespace std;
  8.   typedef vector<char> vec_char;
  9.   vec_char thestr;
  10.   copy(istream_iterator<char>(cin),istream_iterator<char>(),back_insert_iterator<vec_char>(thestr));
  11.   if(next_permutation(thestr.begin(),thestr.end()))
  12.     copy(thestr.begin(),thestr.end(),ostream_iterator<char>(cout));
  13.   else
  14.     return -1;
  15.   return 0;
  16. }

复制代码

[ 本帖最后由 doctorjxd 于 2007-3-31 11:17 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-03-31 11:31 |只看该作者
例如取完组合后:


  1. #!/bin/sh

  2. ...

  3. #比如是good
  4. mystring="good"

  5. #排序处理
  6. mystring=`echo $mystring  | sed 's/\(.\)/\1\
  7. /g;s/\n$//;' | sort | sed -n -e :a -e 'N;$!ba' -e 's/\n//g;p;'`

  8. #处理排列
  9. while [ ! -z $mystring ]
  10. do
  11.   #显示或其他处理
  12.   echo $mystring
  13.   #调用自己的工具
  14.   mystring=`echo $mystring | ./mytool`
  15. done
复制代码

[ 本帖最后由 doctorjxd 于 2007-3-31 12:02 编辑 ]

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2007-03-31 14:18 |只看该作者
非常感谢,这个程序非常精简,而且完全达到了我的要求。

只是有个问题: 运行这个语句的时候, 放在程序里,没有输出结果,但是单独在/bin/sh下执行的时候,输出很正常。

mystring=`echo $mystring  | sed 's/\(.\)/\1\
/g;s/\n$//;' | sort | sed -n -e :a -e 'N;$!ba' -e 's/\n//g;p;'`

echo $mystring

论坛徽章:
0
5 [报告]
发表于 2007-03-31 15:24 |只看该作者
我有个非常笨的办法~ ^_^

  1. seq 10000 100000 |sed '/[0-4]/d;/\(.\).*\1/d' |awk '
  2. BEGIN { split("aefgh", gTable, ""); }
  3. { split($0, arr, ""); for (idx in arr) printf gTable[arr[idx]-4]; printf "\n";}
  4. '
复制代码

论坛徽章:
0
6 [报告]
发表于 2007-03-31 15:41 |只看该作者
哦,没看题。。给出的字母可以重复阿

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
7 [报告]
发表于 2007-03-31 16:22 |只看该作者
原帖由 awk就是awp加ak 于 2007-3-31 15:41 发表
哦,没看题。。给出的字母可以重复阿


没关系,但是也要谢谢。

用doctorjxd 的方法,我只能每次先将字母顺序排列好,也就是跳过那条我碰到问题的语句。但是现在至少已经可以解决我的问题了。

大家知道那条语句为何不能在脚本里执行吗?

论坛徽章:
0
8 [报告]
发表于 2007-03-31 16:30 |只看该作者
原帖由 rdcwayx 于 2007-3-31 14:18 发表
非常感谢,这个程序非常精简,而且完全达到了我的要求。

只是有个问题: 运行这个语句的时候, 放在程序里,没有输出结果,但是单独在/bin/sh下执行的时候,输出很正常。

mystring=`echo $mystring  | sed  ...


不客气,呵呵。
试试这个,把``改成$(....)就行了。


  1. mystring=$(echo $mystring  | sed 's/\(.\)/\1\
  2. /g;s/\n$//;' | sort | sed -n -e :a -e 'N;$!ba' -e 's/\n//g;p;')


复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
9 [报告]
发表于 2007-03-31 17:46 |只看该作者
原帖由 doctorjxd 于 2007-3-31 16:30 发表


不客气,呵呵。
试试这个,把``改成$(....)就行了。


  1. mystring=$(echo $mystring  | sed 's/\(.\)/\1\
  2. /g;s/\n$//;' | sort | sed -n -e :a -e 'N;$!ba' -e 's/\n//g;p;')


复制代码


再次感谢,这次成功了。

论坛徽章:
0
10 [报告]
发表于 2007-03-31 18:10 |只看该作者
想到一种更令人抓狂的方法,没试验~
  1. seq 10000 100000 |sed '/[0-4]/d;/\(.\).*\1/d' |awk '
  2. BEGIN { split("aefgh", gTable, ""); }
  3. {
  4.     split($0, arr, "");
  5.     for (idx in arr) printf gTable[arr[idx]-4];
  6.     printf "\n";
  7. }' |sed 's,g,a,' |sort -u
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP