Chinaunix

标题: 如何得到不同原子排列的可能组合方式?要求不重复 [打印本页]

作者: njuytwc    时间: 2011-10-01 22:07
标题: 如何得到不同原子排列的可能组合方式?要求不重复
本帖最后由 njuytwc 于 2011-10-02 10:26 编辑

先祝福大家十一快乐,有这么一个化学问题,如原子碳和氮,希望对3个碳(用C表示)和4个氮(用N表示)进行线性组合,但不能重复,比如CCCNNNN和NNNNCCC就是重复的。要求得到他们具体可能的组合方式。谢谢大家

补充,由于说法不严谨,不好意思,现在补充一下四楼的意见,就是把字符串倒序之后跟其它字符串不重复。比如CCNNNNC及CNNNNCC就是重复的。欢迎大家讨论。谢谢
作者: lx8384    时间: 2011-10-01 23:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: mpstat    时间: 2011-10-02 01:25
不懂lz说的重复的具体意思是什么啊
还有别的啥重复的例子没有?
有严谨的说法么
作者: Shell_HAT    时间: 2011-10-02 09:37
把字符串倒序之后跟其它字符串不重复,是这样吗?
作者: njuytwc    时间: 2011-10-02 10:27
回复 3# mpstat


   正如四楼所说,把字符串倒序之后跟其它字符串不重复。就是这样意思,欢迎解答。谢谢
作者: njuytwc    时间: 2011-10-02 10:28
回复 4# Shell_HAT
正解,呵呵。能用shell编程解答么?
作者: njuytwc    时间: 2011-10-02 22:36
有人能解决不?盼解决
作者: yinyuemi    时间: 2011-10-03 08:46
回复 7# njuytwc
  1. awk -v txt="CCCNNNNN" 'BEGIN{print txt;for(i=1;i<=3;i++)for(j=4;j<=8;j++)s(i,j)}function s(a,b){split(txt,arr,"");t=arr[a];arr[a]=arr[b];arr[b]=t;for(x=1;x<=length(arr);x++)printf arr[x];print ""}'
  2. CCCNNNNN
  3. NCCCNNNN
  4. NCCNCNNN
  5. NCCNNCNN
  6. NCCNNNCN
  7. NCCNNNNC
  8. CNCCNNNN
  9. CNCNCNNN
  10. CNCNNCNN
  11. CNCNNNCN
  12. CNCNNNNC
  13. CCNCNNNN
  14. CCNNCNNN
  15. CCNNNCNN
  16. CCNNNNCN
  17. CCNNNNNC
复制代码

作者: xtdddd2000    时间: 2011-10-03 09:22
楼上犀利。。。。。。。不过代码贴过去就错了。自己打下好了。
作者: ywlscpl    时间: 2011-10-03 10:06
8楼的算法还是有问题的,并没有穷举出来
如:CNNNCNNC
作者: yinyuemi    时间: 2011-10-03 12:15
8楼的算法还是有问题的,并没有穷举出来
如:CNNNCNNC
ywlscpl 发表于 2011-10-03 10:06



    的确是有问题,想要awk写个递归穷尽,没成功,还是用perl吧
  1. cat s.pl

  2. #!/bin/perl

  3. use strict;

  4. my $txt="CCCNNNNN";
  5. my @array=split "", $txt;
  6. my %hash;

  7. sub switch{
  8.         my $t;
  9.         my ($a,$b,$c)=@_;
  10.         $t=@$c[$a];
  11.         @$c[$a]=@$c[$b];
  12.         @$c[$b]=$t;
  13. }

  14. sub arrange{
  15.         my $i;
  16.         my ($index,@arr)=@_;
  17.         if($index==8) {
  18.                         my $t=join "", @arr;
  19.                         if(! defined $hash{$t}){
  20.                                 $hash{$t}++;$hash{reverse $t}++;print @arr,"\n";
  21.                         }
  22.         }
  23.         else{
  24.                 for($i=$index;$i<8;$i++){
  25.                         switch($index,$i,\@arr);
  26.                         arrange($index+1,@arr);
  27.                         switch($index,$i,\@arr);
  28.                 }
  29.         }
  30. }

  31. arrange(0,@array);

  32. perl s.pl
  33. CCCNNNNN
  34. CCNCNNNN
  35. CCNNCNNN
  36. CCNNNCNN
  37. CCNNNNCN
  38. CCNNNNNC
  39. CNCCNNNN
  40. CNCNCNNN
  41. CNCNNCNN
  42. CNCNNNCN
  43. CNCNNNNC
  44. CNNCCNNN
  45. CNNCNCNN
  46. CNNCNNCN
  47. CNNCNNNC
  48. CNNNCCNN
  49. CNNNCNCN
  50. CNNNNCCN
  51. NCCCNNNN
  52. NCCNCNNN
  53. NCCNNCNN
  54. NCCNNNCN
  55. NCNCCNNN
  56. NCNCNCNN
  57. NCNCNNCN
  58. NCNNCCNN
  59. NNCCCNNN
  60. NNCCNCNN

复制代码

作者: zooyo    时间: 2011-10-03 15:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: njuytwc    时间: 2011-10-05 23:18
回复 11# yinyuemi
辛苦了,这个是对的,不过如果有x个C和y个N,这个程序可以通用吗?比如2个C,4个N这样的可以排多少?该如何修改s.pl程序呢?
作者: njuytwc    时间: 2011-10-05 23:43
回复 11# yinyuemi


    貌似会修改了,谢谢。不过我想知道你这个程序思想是怎么样的,基于什么原理?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2