zoukankan      html  css  js  c++  java
  • 欧拉计划之题目11:在20×20的网格中同一直线上四个数的最大乘积是多少?

    本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/12-1120t20

    我的分析:

    列,行的比较不用说了,关键是左上,右下的2条对角。

    在网上搜索的代码,要么是perl语言的,要么是C语言错误的(反正我看不懂)。

    我的左上:在5 x 5方格中,选取其中右斜着的3个数,那它的第一个数,肯定在左上的3*3中,后2个数,是前一个数加1.

    我的右下:同上,在5 x 5方格中,选取其中左斜的3个数,那它的第一个数,肯定在右上3*3中,后2个数,对应坐标相加减.

      1 # include <stdio.h>
      2 
      3 int max;
      4 int r1,c1,r2,c2,r3,c3,r4,c4;    // 4个数的位置 
      5 int a[21][21]={
      6     {8,2,22,97,38,15,0,40,0,75,04,05,7,78,52,12,50,77,91,8},
      7     {49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,04,56,62,0},
      8     {81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,03,49,13,36,65},
      9     {52,70,95,23,04,60,11,42,69,24,68,56,01,32,56,71,37,02,36,91},
     10     {22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80},
     11     {24,47,32,60,99,03,45,02,44,75,33,53,78,36,84,20,35,17,12,50},
     12     {32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70},
     13     {67,26,20,68,02,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21},
     14     {24,55,58,05,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72},
     15     {21,36,23,9,75,00,76,44,20,45,35,14,0,61,33,97,34,31,33,95},
     16     {78,17,53,28,22,75,31,67,15,94,03,80,04,62,16,14,9,53,56,92},
     17     {16,39,05,42,96,35,31,47,55,58,88,24,00,17,54,24,36,29,85,57},
     18     {86,56,00,48,35,71,89,07,05,44,44,37,44,60,21,58,51,54,17,58},
     19     {19,80,81,68,05,94,47,69,28,73,92,13,86,52,17,77,04,89,55,40},
     20     {04,52,8,83,97,35,99,16,07,97,57,32,16,26,26,79,33,27,98,66},
     21     {88,36,68,87,57,62,20,72,03,46,33,67,46,55,12,32,63,93,53,69},
     22     {04,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36},
     23     {20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,04,36,16},
     24     {20,73,35,29,78,31,90,01,74,31,49,71,48,86,81,16,23,57,05,54},
     25     {01,70,54,71,83,51,54,69,16,92,33,48,61,43,52,01,89,19,67,48}
     26     };
     27     
     28 void Rows()
     29 {
     30     int temp=1;
     31     int i,j;
     32     for(i=0;i<20;i++)
     33     {
     34         for(j=0;j<17;j++)
     35         {
     36             if(a[i][j]&&a[i][j+1]&&a[i][j+2]&&a[i][j+3])
     37             {
     38                 temp=a[i][j]*a[i][j+1]*a[i][j+2]*a[i][j+3];
     39                 if(max<temp)
     40                 {
     41                     max = temp;
     42                     r1=i,c1=j;
     43                     r2=i,c2=j+1;
     44                     r3=i,c3=j+2;
     45                     r4=i,c4=j+3;
     46                 }
     47             }
     48         }
     49     }
     50 }
     51 
     52 void Columns()
     53 {
     54     int temp=0;
     55     int i,j;
     56     for(j=0;j<20;j++)
     57     {
     58         for(i=0;i<17;i++)
     59         {
     60             if(a[i][j]&&a[i+1][j]&&a[i+2][j]&&a[i+3][j])
     61             {
     62                 temp=a[i][j]*a[i+1][j]*a[i+2][j]*a[i+3][j];
     63                 if(max<temp)
     64                 {
     65                     max = temp;
     66                     r1=i,c1=j;
     67                     r2=i+1,c2=j;
     68                     r3=i+2,c3=j;
     69                     r4=i+3,c4=j;
     70                 }
     71             }
     72         }
     73     }
     74 }
     75 
     76 void Lefts()
     77 {
     78     int temp=0;
     79     int i,j;
     80     for(i=0;i<=16;i++)
     81     {
     82         for(j=0;j<=16;j++)
     83         {
     84             if(a[i][j]&&a[i+1][j+1]&&a[i+2][j+2]&&a[i+3][j+3])
     85             {
     86                 temp=a[i][j]*a[i+1][j+1]*a[i+2][j+2]*a[i+3][j+3];
     87                 if(max<temp)
     88                 {
     89                     max = temp;
     90                     r1=i,c1=j;
     91                     r2=i+1,c2=j+1;
     92                     r3=i+2,c3=j+2;
     93                     r4=i+3,c4=j+3;
     94                 }
     95             }
     96         }
     97     }
     98 }
     99 
    100 void Rights()
    101 {
    102     int temp=0;
    103     int i,j;
    104     for(i=0;i<17;i++)
    105     {
    106         for(j=19;j>2;j--)
    107         {
    108             if(a[i][j]&&a[i+1][j-1]&&a[i+2][j-2]&&a[i+3][j-3])
    109             {
    110                 temp=a[i][j]*a[i+1][j-1]*a[i+2][j-2]*a[i+3][j-3];
    111                 if(max<temp)
    112                 {
    113                     max = temp;
    114                     r1=i,c1=j;
    115                     r2=i+1,c2=j-1;
    116                     r3=i+2,c3=j-2;
    117                     r4=i+3,c4=j-3;
    118                 }
    119             }
    120         }
    121     }
    122 }
    123 
    124 int main ()
    125 {
    126     max = 0;
    127 
    128     Rows();
    129     Columns();
    130     Lefts();
    131     Rights();
    132     
    133     printf("位置是: a[%d][%d], a[%d][%d], a[%d][%d], a[%d][%d]
    ",r1,c1,r2,c2,r3,c3,r4,c4);
    134     printf("%d * %d * %d * %d == %d
    ",a[r1][c1],a[r2][c2],a[r3][c3],a[r4][c4],max);
    135     return 0;
    136 }
    View Code

    如果有错误,希望能指证!!!

  • 相关阅读:
    谷歌推开发者培训指南 欲提升Android软件质量
    装饰者模式【java版】
    Java GetBytes 编码方式
    为什么程序员都是夜猫子
    Android的Handler总结
    常见的自然法则及管理启示
    java常用设计模式
    Android optionsmenu例程
    关于程序员成长的一点思考
    Java 字节流读写文件
  • 原文地址:https://www.cnblogs.com/orange1438/p/3501149.html
Copyright © 2011-2022 走看看