免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發新帖
樓主: sunzhiguolu
打印 上一主題 下一主題

小學一年級數學題 - 系列-3 [復制鏈接]

論壇徽章:
0
11 [報告]
發表于 2017-06-25 08:41 |只看該作者
首先说我的答案,有八种。下面说说我的思路,大家看对不对。

第一步:九宫格的中心必须是5。因为中间的数字的两边与对角必须是四对加起来和一致的数。只有取5才能有四对。

到处为止,问题转化成了,四对数加起来等于十的排列组合有多少种?很容易知道是四对数,19,28,37,46

第二步:分析四个角的位置。我分析结论是四个角必须是偶数。因为边之和必须是15,三个数之和是奇数,则必定是俩偶一奇。假定一个角的数是奇数,那么它的对角必定是奇数。同时边的另外两个数就必须得是偶数。也就是边上除了这俩奇数,其他位置必须是偶数。就得有六个偶数,但我们只有四个偶数,所以不可能。

结论一,这时候我们知道四条边中心都是奇数,它们的不同排列组合就是一层运算情况。那么现在来分析下偶数位置会变么?

答案是不会。因为在偶数对中,28,46拆分配对的对所有情况只有两种,一种是24,68。一种是26,48。这两种情况的四个和分别是6,8,12,14。分别对应了四个奇数需要的值。所以每个奇数两边的偶数是固定。并且两个不相对的俩奇数必定需要同样的一个偶数。比如,1需要的组合是68里面有6,7需要的组合是26里面有6。其他情况一样。

所以,问题最终就转化成了转化成了,1、3、5、7四个奇数在四条边中心的位置组合,且要分离相对。

代码表示的话就是,把四条边线中心位,表示位数组的四个索引0,1,2,3。19和37在数组中的位置交叉即可。

很容易看出有8种:1397、1793、9317、9713、3179、3971、7139、7931

奇数组合出来后,偶数排列组合就不说了。找出俩奇数的共同偶数放夹角即可。

纯分析手打,就不上代码了(说不定代码我也不会写

論壇徽章:
0
12 [報告]
發表于 2017-06-25 08:51 |只看該作者
田小江 發表于 2017-06-25 08:41
首先说我的答案,有八种。&#19 ...

最后我想补充的就是,分析完后,用最优的或者你会的数据结构和算法。把各种组合算出来即可。

論壇徽章:
307
程序設計版塊每周發帖之星
日期:2016-04-08 00:41:33操作系統版塊每日發帖之星
日期:2015-09-02 06:20:00每日論壇發貼之星
日期:2015-09-02 06:20:00程序設計版塊每日發帖之星
日期:2015-09-04 06:20:00每日論壇發貼之星
日期:2015-09-04 06:20:00每周論壇發貼之星
日期:2015-09-06 22:22:00程序設計版塊每日發帖之星
日期:2015-09-09 06:20:00程序設計版塊每日發帖之星
日期:2015-09-19 06:20:00程序設計版塊每日發帖之星
日期:2015-09-20 06:20:00每日論壇發貼之星
日期:2015-09-20 06:20:00程序設計版塊每日發帖之星
日期:2015-09-22 06:20:00程序設計版塊每日發帖之星
日期:2015-09-24 06:20:00
13 [報告]
發表于 2017-06-25 15:24 |只看該作者
本帖最后由 sunzhiguolu 于 2017-06-25 15:29 編輯

回復 11# 田小江
首先一點 非常感謝您的精彩分析。將本來一團亂麻的思路 變得清晰了起來。
就是不知道 如果將心中所想落實到代碼會是怎樣。(按照您的分析,代碼一定非常精彩)

論壇徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役紀念章
日期:2018-03-16 10:24:0515-16賽季CBA聯賽之山東
日期:2017-11-10 14:32:142016科比退役紀念章
日期:2017-09-02 15:42:4715-16賽季CBA聯賽之佛山
日期:2017-08-28 17:11:5515-16賽季CBA聯賽之浙江
日期:2017-08-24 16:55:1715-16賽季CBA聯賽之青島
日期:2017-08-17 19:55:2415-16賽季CBA聯賽之天津
日期:2017-06-29 10:34:4315-16賽季CBA聯賽之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亞冠之薩濟拖拉機
日期:2015-05-22 11:38:5315-16賽季CBA聯賽之北京
日期:2019-08-13 17:30:53
14 [報告]
發表于 2017-06-25 23:19 |只看該作者
本帖最后由 523066680 于 2017-06-25 23:20 編輯
  1. =info
  2.     Code by 523066680
  3.     2017-06
  4.     排列元素的方案參考自 http://stackoverflow.com/questions/9122315/permutations-using-perl
  5. =cut

  6. use List::Util qw/sum/;

  7. our @a = (1..9);

  8. #分組,校驗的下標順序
  9. our @chk =
  10.     (
  11.         [1,2,3], [4,5,6], [7,8,9],
  12.         [1,4,7], [2,5,8], [3,6,9],
  13.         [1,5,9], [3,5,7],
  14.     );

  15. #純屬冗余操作(為了前面直觀)。統一 -1
  16. grep { $_ = [map { $_-1 } @$_] } @chk;  #全體 -1

  17. #開始迭代
  18. for ( &permute( @a ) )
  19. {
  20.     if (check($_) == 1)
  21.     {
  22.         print join(",", @{$_}[0,1,2]),"\n";
  23.         print join(",", @{$_}[3,4,5]),"\n";
  24.         print join(",", @{$_}[6,7,8]),"\n\n";
  25.     }
  26. }

  27. sub permute
  28. {
  29.     return ([]) unless (@_);
  30.     return map
  31.     {
  32.         my @cdr = @_;
  33.         my $car = splice @cdr, $_, 1;
  34.         map { [$car, @$_] } &permute(@cdr);
  35.     } 0 .. $#_;
  36. }

  37. sub check
  38. {
  39.     my $a_ref = shift;
  40.     my $result = 1;

  41.     for my $ref (@chk)
  42.     {
  43.         if ( sum( map { $a_ref->[$_] } @$ref ) != 15 )
  44.         {
  45.             $result = 0;
  46.             last;
  47.         }

  48.     }
  49.     return $result;
  50. }
復制代碼


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

[Finished in 7.2s]

優化肯定是有的優化的,只是想看看暴力跑法。(我的strawberry perl 安裝  Algorithm:ermute 失敗了,所以先借用一下別人寫好的排列方案)

論壇徽章:
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
15 [報告]
發表于 2017-06-26 00:43 |只看該作者
回復 9# jason680

窮舉法 再優化 改良...
填入[0,1]立即檢查[0] + [1] > 5 , [2] = 15 -( [0] + [1] )
3 Q ~~

論壇徽章:
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
16 [報告]
發表于 2017-06-26 00:51 |只看該作者
回復 14# 523066680

[Finished in 7.2s]
good machine ~~
wode:
real        0m22.694s
user        0m22.413s
sys        0m0.167s



論壇徽章:
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
17 [報告]
發表于 2017-06-26 01:00 |只看該作者
本帖最后由 rubyish 于 2017-06-25 21:03 編輯

回復 11# 田小江

下面說說我的思路

3Q ~ zhege youyisi. XXle.
  1. #!/usr/bin/perl
  2. # (v5.26.0)
  3. use 5.010;

  4. make();

  5. # _____________________SUB____________________

  6. sub make {
  7.     my @abcd = ( 2, 4, 6, 8 );

  8.     for my $a (@abcd) {
  9.         my $b = 10 - $a;
  10.         my @cd = grep { $_ != $a and $_ != $b } @abcd;
  11.         for my $cd ( [@cd], [ reverse @cd ] ) {
  12.             my ( $c, $d ) = @$cd;
  13.             my @X = ( 15 - $a - $c, 15 - $a - $d, 15 - $c - $b, 15 - $d - $b );

  14.             # a  X0 c
  15.             # X1 5  X2
  16.             # d  X3 b

  17.             say join ' ', $a, $X[0], $c;
  18.             say join ' ', $X[1], 5, $X[2];
  19.             say join ' ', $d, $X[3], $b;
  20.             say '------';
  21.         }
  22.     }
  23. }

  24. __DATA__
  25. $_
復制代碼




論壇徽章:
307
程序設計版塊每周發帖之星
日期:2016-04-08 00:41:33操作系統版塊每日發帖之星
日期:2015-09-02 06:20:00每日論壇發貼之星
日期:2015-09-02 06:20:00程序設計版塊每日發帖之星
日期:2015-09-04 06:20:00每日論壇發貼之星
日期:2015-09-04 06:20:00每周論壇發貼之星
日期:2015-09-06 22:22:00程序設計版塊每日發帖之星
日期:2015-09-09 06:20:00程序設計版塊每日發帖之星
日期:2015-09-19 06:20:00程序設計版塊每日發帖之星
日期:2015-09-20 06:20:00每日論壇發貼之星
日期:2015-09-20 06:20:00程序設計版塊每日發帖之星
日期:2015-09-22 06:20:00程序設計版塊每日發帖之星
日期:2015-09-24 06:20:00
18 [報告]
發表于 2017-06-28 19:38 |只看該作者
回復 7# rubyish
大神知道你厲害,有個地方不是很懂。
如果代碼 添加了 use warnings; 該怎樣改動一下?

論壇徽章:
307
程序設計版塊每周發帖之星
日期:2016-04-08 00:41:33操作系統版塊每日發帖之星
日期:2015-09-02 06:20:00每日論壇發貼之星
日期:2015-09-02 06:20:00程序設計版塊每日發帖之星
日期:2015-09-04 06:20:00每日論壇發貼之星
日期:2015-09-04 06:20:00每周論壇發貼之星
日期:2015-09-06 22:22:00程序設計版塊每日發帖之星
日期:2015-09-09 06:20:00程序設計版塊每日發帖之星
日期:2015-09-19 06:20:00程序設計版塊每日發帖之星
日期:2015-09-20 06:20:00每日論壇發貼之星
日期:2015-09-20 06:20:00程序設計版塊每日發帖之星
日期:2015-09-22 06:20:00程序設計版塊每日發帖之星
日期:2015-09-24 06:20:00
19 [報告]
發表于 2017-06-28 19:56 |只看該作者
另外, 7樓代碼 利用遞歸的方式求解 我不是很理解。
不知哪位大神 有時間幫忙 解釋一下,最好詳細一點。
如果能讓我從中有所受益 本人愿出 (1000 積分作為回報, 視情形可提高積分比重 另外再加 +5000 積分作為感謝)

論壇徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役紀念章
日期:2018-03-16 10:24:0515-16賽季CBA聯賽之山東
日期:2017-11-10 14:32:142016科比退役紀念章
日期:2017-09-02 15:42:4715-16賽季CBA聯賽之佛山
日期:2017-08-28 17:11:5515-16賽季CBA聯賽之浙江
日期:2017-08-24 16:55:1715-16賽季CBA聯賽之青島
日期:2017-08-17 19:55:2415-16賽季CBA聯賽之天津
日期:2017-06-29 10:34:4315-16賽季CBA聯賽之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亞冠之薩濟拖拉機
日期:2015-05-22 11:38:5315-16賽季CBA聯賽之北京
日期:2019-08-13 17:30:53
20 [報告]
發表于 2017-06-28 20:32 |只看該作者
本帖最后由 523066680 于 2017-06-28 22:10 編輯

回復 19# sunzhiguolu

這個遞歸寫的非常精簡,我以前也用類似的方案寫排列,不過代碼比較長。
將 E_ 函數單獨提取出來,把 “語法糖” 之類的東西采用更明確的方式去書寫,思路就看得清楚了。
為了方便把元素 1到9 改成了a,b,c。

my @elements = qw/a b c/;
my @container = ();

#傳入數組引用,左邊是可選元素,右邊是容器
func( \@elements, \@container );

sub func
{
    #引用分別傳遞到 $a,$b
    my ( $a, $b ) = (shift, shift);
    my $last = $#$a;

    #如果 @$a 的元素已經清空,打印 @$b 的內容
    print join(",", @{$b}), "\n" if ( $last < 0 );
   
    #遍歷選取 @$a 的元素
    for my $idx ( 0 .. $last )
    {
        #從 @$a 副本取出元素,添加到 @$b,進入下一層選取
        func( [ @$a[0 .. $idx-1, $idx+1 .. $last] ], [ @$b, $a->[$idx] ] );
    }
}

輸出:

a,b,c
a,c,b
b,a,c
b,c,a
c,a,b
c,b,a

這個過程可以參考高中的排列組合/概率知識,
第一層,先從 [a,b,c] 中選1個,假設是選 b
第二層,從 剩下的 [a,c] 中選取1個,假設是 a
第三層,從 剩下的 [c] 中選取1個,即 c
最后得到 b,a,c

第一層有3個選項,第二層有2個選項,最后一層1個,共有 3x2x1 種排列順序。

然后是校驗的部分,

    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[0,1,2]\n@$b[3,4,5]\n@$b[6,7,8]\n";
        print "-----\n";
    }

多個層次的判斷可以減少大量冗余的排列過程,例如第一個判斷:
當容器數組達到3個元素,可以計算第一行是否和為15,不是的話可以提前退回,節省后面6個元素的排列過程。
后面的判斷與此類似。
最后當容器數組的元素達到9個,且最后斜線合計也為15,對符合要求的排列順序進行輸出。

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則 發表回復

  

北京盛拓優訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區
中國互聯網協會會員  聯系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP
   日韩综合区视频第一页导航,无码JK粉嫩小泬在线观看,午夜精品A片一区二区三区,日日躁夜夜躁狠狠躁麻豆,大胆国模,免费观看无遮挡www的网站