免费注册 查看新帖 |

Chinaunix

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

求数列反转距离 [复制链接]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
11 [报告]
发表于 2015-09-15 02:29 |只看该作者
maybe:
  1. #!/usr/bin/perl

  2. my ( $more, $less, $ok, %has );

  3. sub pick {
  4.     my ( $a, $min ) = ( shift, $more );
  5.     my @bad = map {
  6.         my ( $m, @in ) = ( 0, 0, @$_, $more );
  7.         abs( $in[ $_ + 1 ] - $in[$_] ) != 1 and $m++ for 0 .. @$_;
  8.         $m < $min ? ( $min = $m ) : $m;
  9.     } @$a;
  10.     [ @$a[ grep { $bad[$_] == $min } 0 .. $#bad ] ];
  11. }

  12. sub turn {
  13.     my ( $a, $it ) = @_;
  14.     my @good = map {
  15.         my @fore = @$_;
  16.         map {
  17.             my $i = $_;
  18.             map {
  19.                 my @new = @fore;
  20.                 @new[ $i .. $_ ] = reverse @new[ $i .. $_ ];
  21.                 my $this = join $", @new;
  22.                 print "count = $it\n" and return if $this eq $ok;
  23.                 !$has{$this}++ ? [@new] : ()
  24.             } $i + 1 .. $#fore;
  25.         } 0 .. $less;
  26.     } @$a;
  27.     [@good];
  28. }

  29. sub count {
  30.     my ( $A, $B ) = @_;
  31.     print "count = 0\n" and return if "@$A" eq "@$B";
  32.     my $it   = 0;
  33.     my @A    = map { $_ + 1 } sort { $A->[$a] <=> $A->[$b] } 0 .. $#$A;
  34.     my @B    = map { $A[ $_ - 1 ] } @$B;
  35.     my $good = [ [@B] ];
  36.     %has = ( "@B", 1 );
  37.     $good = pick( turn( $good, ++$it ) or return ) while 1;
  38. }

  39. while (<DATA>) {
  40.     my $next = <DATA>;
  41.     print $/, $_, $next;
  42.     my $A = [split];
  43.     my $B = [ split /\s/, $next ];
  44.     $more = @$A + 1;
  45.     $less = $#$A - 1;
  46.     $ok   = join $", 1 .. @$A;
  47.     count $A, $B;
  48. }

  49. # 9 4 5 7 0

  50. __DATA__
  51. 1 2 3 4 5 6 7 8 9 10
  52. 3 1 5 2 7 4 9 6 10 8
  53. 3 10 8 2 5 4 7 1 6 9
  54. 5 2 3 1 7 4 10 8 6 9
  55. 8 6 7 9 4 1 3 10 2 5
  56. 8 2 7 6 9 1 5 3 10 4
  57. 3 9 10 4 1 8 6 7 5 2
  58. 2 9 8 5 1 7 3 4 6 10
  59. 1 2 3 4 5 6 7 8 9 10
  60. 1 2 3 4 5 6 7 8 9 10
复制代码

论坛徽章:
0
12 [报告]
发表于 2015-09-15 08:58 |只看该作者
回复 11# rubyish
测试了,结果是对的,谢谢大神


   

论坛徽章:
0
13 [报告]
发表于 2015-09-17 09:36 |只看该作者
回复 11# rubyish
大神,我perl知识有限,没看太明白,能大概讲一下思路算法吗


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
14 [报告]
发表于 2015-09-18 04:59 |只看该作者
回复 13# anna_bi

biru [pseudocode]:


  1. ok = [1 .. 10]
  2. b  = [5 4 1 8 7 6 2 3 9 10]
  3. B  = [b]
  4. c  = 0

  5. LOOP
  6.     c++
  7.     all = turn B
  8.     FOR this all
  9.         IF this EQ ok
  10.             SAY c
  11.             STOP LOOP

  12.     B = pick all
  13.    
复制代码
1: sub count

__DATA__
3 10 8 2 5 4 7 1 6 9
5 2 3 1 7 4 10 8 6 9


$A: 3 10 8 2 5 4 7 1 6 9
@A: 8 4 1 6 5 9 7 3 10 2

8:  1 de index + 1
4:  2 de index + 1
1:  3 de index + 1
6:  4 de index + 1
...
2:  10 de index + 1

@A: 8 4 1 6 5 9 7 3 10 2
$B: 5 2 3 1 7 4 10 8 6 9
@B: 5 4 1 8 7 6 2 3 9 10

5:  @A de index ( 5 - 1 )
4:  @A de index ( 2 - 1 )
1:  @A de index ( 3 - 1 )
...
10: @A de index ( 9 - 1 )

@B:     5 4 1 8 7 6 2 3 9 10
$ok:    1 2 3 4 5 6 7 8 9 10

IF @B EQ $ok => finish


2: sub turn, reverse 1 ci, pailie chu suoyou de keneng

@all = turn [ [ 1, 2, 3, 4, 5 ] ];
@all:

[ 2, 1, 3, 4, 5 ]   0 .. 1
[ 3, 2, 1, 4, 5 ]   0 .. 2
[ 4, 3, 2, 1, 5 ]   0 .. 3
[ 5, 4, 3, 2, 1 ]   0 .. 4
[ 1, 3, 2, 4, 5 ]   1 .. 2
[ 1, 4, 3, 2, 5 ]   1 .. 3
[ 1, 5, 4, 3, 2 ]   1 .. 4
[ 1, 2, 4, 3, 5 ]   2 .. 3
[ 1, 2, 5, 4, 3 ]   2 .. 4
[ 1, 2, 3, 5, 4 ]   3 .. 4



3: sub pick, xuanze breakpoint zhuishao de zuhe

@good = pick @all;

breakpoint: X
2 X 5 6 X 1 X 7   

abs( 5 - 2 ) != 1   => bp
abs( 6 - 5 ) == 1   => not bp
abs( 1 - 6 ) != 1   => bp
...



   

论坛徽章:
0
15 [报告]
发表于 2015-09-18 09:32 |只看该作者
回复 14# rubyish
明白了,谢谢大神


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP