Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006588
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: Python/Ruby

2012-04-27 12:15:07

 
多米诺骨牌(DOMINO

问题描述:有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上16个点。现有一行排列在桌面上:

顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。顶行和底行的差值是2。这个差值是两行点数之和的差的绝对值。每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。

现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。对于上面这个例子,我们只需翻转最后一个骨牌,就可以使得顶行和底行的差值为0,所以例子的答案为1


  1. our $Count = 6;
  2. my @up = (1,3,4,5,3,6);
  3. my @down = (2,3,6,1,2,6);
  4. sub swap{
  5.     my @tup = @up;
  6.     my @tdown = @down;

  7.     my @arr = split("",shift);
  8.     my $i = 0;
  9.     my $count =0;
  10.     for(@arr){
  11.         if($_==1){
  12.             my $t = $tup[$i];
  13.             $tup[$i] = $tdown[$i];
  14.             $tdown[$i] = $t;
  15.             $count++;
  16.         }
  17.         $i++;
  18.     }
  19.     my ($sup, $sdown);
  20.     for(@tup){
  21.         $sup+=$_;
  22.     }
  23.     for(@tdown){
  24.         $sdown+=$_;
  25.     }
  26.     return abs($sup - $sdown),$count;
  27. }

  28. sub toBinary{
  29.     my $i = shift;
  30.     return $i if($i<2);
  31.     my $mod = $i%2;
  32.     $i = ($i - $mod)/2;
  33.     return toBinary($i).$mod;
  34. }

  35. sub allp{
  36.     my @result;
  37.     for(0..shift){
  38.         my $t = toBinary($_);
  39.         my $r = "0"x($Count-length($t)).$t;
  40.         push (@result, $r);
  41.     }
  42.     return @result;
  43. }

  44. my ($value, $times) = 100;
  45. my $q;
  46. for(allp(2**$Count-1)){
  47.     my ($tv, $tt) = swap($_);
  48.     if($tv<$value){
  49.         $value = $tv;
  50.         $times = $tt;
  51.         $q = $_;
  52.         
  53.     }
  54.     elsif($tt<$times and $value == $tv){
  55.         $times = $tt ;
  56.         $q = $_;
  57.     }
  58. }

  59. print "Result !!!\n";
  60. print "$value: $times: $q";

阅读(1971) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~