免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yxm0513
打印 上一主题 下一主题

又是个算法问题,帮忙看下 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-01-22 19:50 |只看该作者
原帖由 yxm0513 于 2009-1-22 19:36 发表
好像是有点问题,改下


难道正确的应该是:用list中的数字组成k位数(可重复使用), 从小到大排列 ???

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
12 [报告]
发表于 2009-01-22 20:12 |只看该作者

回复 #10 ynchnluiti 的帖子

我猜对了。

DQP 的代码可以使用,只要将结果集稍做过滤即可。

论坛徽章:
0
13 [报告]
发表于 2009-01-22 20:16 |只看该作者
原帖由 Lonki 于 2009-1-22 19:50 发表


难道正确的应该是:用list中的数字组成k位数(可重复使用), 从小到大排列 ???




未必是数, @data可以是 (a, b , c)

只是排列组合

论坛徽章:
0
14 [报告]
发表于 2009-01-22 21:30 |只看该作者
前人栽树

#!/usr/bin/perl


my @data = qw(a b c);
my $k = 4;
my $all='';

sub foo {
  my @cur_list = @_;
  if(@cur_list == $k){
    my @sort = sort @cur_list;
    my $a = join '', @sort;
    unless ($all =~ /$a/){
        $all .= $a ."\n";
    }
    return;
  }
  foo(@cur_list, $_) foreach @data;
}
foo;

print $all;

论坛徽章:
0
15 [报告]
发表于 2009-01-22 21:36 |只看该作者
原帖由 ly5066113 于 2009-1-22 20:12 发表
我猜对了。

DQP 的代码可以使用,只要将结果集稍做过滤即可。



不用过滤吧, 全排列

论坛徽章:
0
16 [报告]
发表于 2009-01-22 22:20 |只看该作者
#!/usr/bin/perl


use strict;
use warnings;

my @data = (1, 2, 3);
my $k = 4;
my $end = $data[-1];

@data = map {$data[0]} 1..$k;

print @data, "\n";
while (1) {
    my $t = -1;

    REDO:
    $data[$t] += 1;
    if ($data[$t] > $end) {
        $t -= 1;
        last if abs $t > $k;
        goto REDO;
    }
    @data[$t .. -1] = map {$data[$t]} ($t .. -1);
    print @data, "\n";
}


__END__
for @data = (1, 2, 3) and $k = 4:
    (1, 1, 1, 1)
    (1, 1, 1, 2)
    (1, 1, 1, 3)
    (1, 1, 2, 2)
    (1, 1, 2, 3)
    (1, 1, 3, 3)
    (1, 2, 2, 2)
    (1, 2, 2, 3)
    (1, 2, 3, 3)
    (1, 3, 3, 3)
    (2, 2, 2, 2)
    (2, 2, 2, 3)
    (2, 2, 3, 3)
    (2, 3, 3, 3)
    (3, 3, 3, 3)


[ 本帖最后由 cobrawgl 于 2009-1-23 09:26 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
17 [报告]
发表于 2009-01-22 22:30 |只看该作者
原帖由 ly5066113 于 2009-1-22 20:12 发表
我猜对了。
DQP 的代码可以使用,只要将结果集稍做过滤即可。

嗯,结果是

论坛徽章:
0
18 [报告]
发表于 2009-01-23 10:07 |只看该作者
搞成这样foo(\@array,$k),如何高,改善中....
#!/usr/bin/perl



my @data = qw(a b c);
my $k = 4;
my $all='';

sub foo {
  my $data = shift;
  my $k = shift;
  my @cur_list = @_;
  if(@cur_list == $k){
    my @sort = sort @cur_list;
    my $a = join '', @sort;
    unless ($all =~ /$a/){
        $all .= $a ."\n";
    }
    return;
  }
  foo(\@data, $k, @cur_list, $_) foreach @$data;
}



foo(\@data, $k);

print $all;


[ 本帖最后由 yxm0513 于 2009-1-23 10:14 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-01-23 10:19 |只看该作者
如果是return $all 或是 @all 呢

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
20 [报告]
发表于 2009-01-23 10:53 |只看该作者
原帖由 yxm0513 于 2009-1-23 10:07 发表
foo(\@data, $k, @cur_list, $_) foreach @$data;

改成
  1. foo($data, $k, @cur_list, $_) foreach @$data;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP