sunzhiguolu 发表于 2017-06-24 23:11

小学一年级数学题 - 系列-3

本帖最后由 sunzhiguolu 于 2017-06-25 15:25 编辑

http://i.imgur.com/EtU661p.jpg

数字 1-9 的范围, 使横,竖,对角的数值分别为 15.
列举所有的可能性,哪位大神会算算术 我实在是不会加减法啊。

jason680 发表于 2017-06-24 23:34

回复 1# sunzhiguolu

# array

#
#
#

# ++ = ++ = ++ = 15
# ++ = ++ = ++ = 15
# ++ = ++ = 15

sunzhiguolu 发表于 2017-06-24 23:52

本帖最后由 sunzhiguolu 于 2017-06-24 23:54 编辑

回复 2# jason680
大神,难道是通过看图片进行求解?
在真实环境中 数值不会像图片中那样摆放的。
很可能就是一组乱序的数字而已,但先决条件是 1-9 个数字,且不会重复。

之所以放置这张图片,是为了让大家更直观的进行观察。而不是照图写答案啊。。。

sunzhiguolu 发表于 2017-06-24 23:59

另外,即使通过观察 利用索引将相关的数组元素 进行求解
进行求解失败后,如何以优雅的方式 将各个元素的数值进行调换?

jason680 发表于 2017-06-25 00:03

本帖最后由 jason680 于 2017-06-25 00:31 编辑

回复 3# sunzhiguolu

穷举法

1数组
@array

2. 分别放入1〜9(所有组合)

3. 检查
$array + $array + $array = 15
....

4. 合格/正碓 则打印

START => 1 => 2 => 3 => 4 => 2 => 3 => 4 => .... 2 => 3 => 4 => END


穷举法 优化 改良...

2跟3混合
填入立即检查 + +
填入再检查 + +
填入再检查 + + , + +
填入再检查 + +
填入不用检查(要检查也可以)


穷举法 再优化 改良...
填入立即检查 + > 5 , = 15 - +
....

穷举法 再再优化 改良...
....

sunzhiguolu 发表于 2017-06-25 00:54

回复 5# jason680
大神不常说怎想怎编程吗? 用代码远比用文字更说明问题。
如果已经有求解思路的话。。。

rubyish 发表于 2017-06-25 04:59

8:
2 7 6
9 5 1
4 3 8
-----
2 9 4
7 5 3
6 1 8
-----
4 3 8
9 5 1
2 7 6
-----
4 9 2
3 5 7
8 1 6
-----
6 1 8
7 5 3
2 9 4
-----
6 7 2
1 5 9
8 3 4
-----
8 1 6
3 5 7
4 9 2
-----
8 3 4
1 5 9
6 7 2
-----


biru:
#!/usr/bin/perl

explore();   

# ______________________ SUB ______________________

sub explore { E_( [ 1 .. 9 ], [] ) }
use List::Util qw;

sub E_ {
    my ( $a, $b ) = @_;
    if    ( @$b == 3 ) { sum( @$b[ 0, 1, 2 ] ) != 15 and return }
    elsif ( @$b == 6 ) { sum( @$b[ 3, 4, 5 ] ) != 15 and return }
    elsif ( @$b == 7 ) { sum( @$b[ 0, 3, 6 ] ) != 15
                     || sum( @$b[ 2, 4, 6 ] ) != 15 and return }
    elsif ( @$b == 8 ) { sum( @$b[ 1, 4, 7 ] ) != 15 and return }
    elsif ( @$b == 9 ) { sum( @$b[ 0, 4, 8 ] ) != 15 and return;
      print "@$b\n@$b\n@$b\n";
      print "-----\n";
    }

    E_( [ @$a[ 0 .. $_ - 1, $_ + 1 .. $#$a ] ], [ @$b, $a->[$_] ] )
      for 0 .. $#$a;
}

__DATA__
$_

rubyish 发表于 2017-06-25 05:09

回复 5# jason680

填入不用检查(要检查也可以)
if no check?
biru:

1 6 8
9 2 4
5 7 3

sum( @A ) = 1 + 2 + 3!= 15

jason680 发表于 2017-06-25 07:25

本帖最后由 jason680 于 2017-06-25 07:42 编辑

回复 8# rubyish

good job


穷举法 再优化 改良...
填入立即检查 + > 5 , = 15 -( + )
填入[0,1,2,3]立即检查 + > 5 , = 15 - ( + )
填入[0,1,2,3,4]立即检查
+ > 5 , = 15 - ( + )
+ > 5 , = 15 - ( + )
+ > 5 , = 15 - ( + )
+ > 5 , = 15 - ( + )
+ > 5 , = 15 - ( + )


jason680 发表于 2017-06-25 08:36

本帖最后由 jason680 于 2017-06-25 09:14 编辑

回复 6# sunzhiguolu

#穷举法 优化

$ time perl 3x3sum15.pl
2 7 6
9 5 1
4 3 8count=1
2 9 4
7 5 3
6 1 8count=2
4 3 8
9 5 1
2 7 6count=3
4 9 2
3 5 7
8 1 6count=4
6 1 8
7 5 3
2 9 4count=5
6 7 2
1 5 9
8 3 4count=6
8 1 6
3 5 7
4 9 2count=7
8 3 4
1 5 9
6 7 2count=8

real    0m0.044s
user    0m0.024s
sys    0m0.004s


#穷举法 无优化
注:这是训练思路过程...
编程则须再提高...

$ time perl 3x3sum15.pl
2 7 6
9 5 1
4 3 8count=1
...
8 3 4
1 5 9
6 7 2count=8

real    16m16.779s
user    16m0.012s
sys    0m0.744s



$ cat 3x3sum15.pl
#
use strict;
use warnings;

# array
#
#
#

my $sCnt = 0;
for my $x0 (1..9){
for my $x1 (1..9){
    #next if($x0 + $x1 < 6);
    #next unless(unique($x0,$x1));
    for my $x2 (1..9){
      #...
      for my $x3 (1..9){
      #...
      for my $x4 (1..9){
          #...
          for my $x5 (1..9){
            #...
            for my $x6 (1..9){
            #...
            for my $x7 (1..9){
               #...
                for my $x8 (1..9){
                  #...
                  if(check_3x3($x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8)){
                  ++$sCnt;
                  print "$x0 $x1 $x2\n$x3 $x4 $x5\n$x6 $x7 $x8count=$sCnt\n";
                  }
                }
            }
            }
          }
      }
      }
    }
}
}
sub unique{
my %hNum;
for(@_){ return 0 if(++$hNum{$_}>1)}
return 1;
}
sub sum{
my $sRet=0;
$sRet += $_ for @_;
return $sRet;
}
sub check_3x3{

return 0 unless(unique(@_));
# ++ = ++ = ++ = 15
return 0 if(sum(@_) != 15);
return 0 if(sum(@_) != 15);
return 0 if(sum(@_) != 15);

# ++ = ++ = ++ = 15
return 0 if(sum(@_) != 15);
return 0 if(sum(@_) != 15);
return 0 if(sum(@_) != 15);

# ++ = ++ = 15
return 0 if(sum(@_) != 15);
return 0 if(sum(@_) != 15);
return 1;

}





页: [1] 2 3 4
查看完整版本: 小学一年级数学题 - 系列-3