小学一年级数学题 - 系列-3
本帖最后由 sunzhiguolu 于 2017-06-25 15:25 编辑http://i.imgur.com/EtU661p.jpg
数字 1-9 的范围, 使横,竖,对角的数值分别为 15.
列举所有的可能性,哪位大神会算算术 我实在是不会加减法啊。
回复 1# sunzhiguolu
# array
#
#
#
# ++ = ++ = ++ = 15
# ++ = ++ = ++ = 15
# ++ = ++ = 15
本帖最后由 sunzhiguolu 于 2017-06-24 23:54 编辑
回复 2# jason680
大神,难道是通过看图片进行求解?
在真实环境中 数值不会像图片中那样摆放的。
很可能就是一组乱序的数字而已,但先决条件是 1-9 个数字,且不会重复。
之所以放置这张图片,是为了让大家更直观的进行观察。而不是照图写答案啊。。。
另外,即使通过观察 利用索引将相关的数组元素 进行求解
进行求解失败后,如何以优雅的方式 将各个元素的数值进行调换? 本帖最后由 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 - +
....
穷举法 再再优化 改良...
....
回复 5# jason680
大神不常说怎想怎编程吗? 用代码远比用文字更说明问题。
如果已经有求解思路的话。。。
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__
$_
回复 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: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 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;
}