项目Euler#11 in Java。我的代码出了什么问题?

时间:2017-06-12 21:31:59

标签: java loops multidimensional-array

我得到51267216作为输出,但答案应该是70600674。 如果有人能提出改进此代码的建议,我也将不胜感激。

// Program to find largest product in a 20x20 grid
public class LargestProductInAGrid 
{
    int a[][] = {{8, 2, 22, 97, 38 ,15 ,0 ,40, 0, 75, 4, 5, 7, 78, 52 ,12 ,50 ,77 ,91 ,8},
    {49 ,49, 99, 40, 17, 81, 18 ,57, 60 ,87 ,17, 40, 98 ,43, 69, 48 ,4, 56 ,62, 0},
    {81 ,49, 31, 73, 55 ,79, 14, 29, 93, 71, 40 ,67, 53, 88, 30, 3, 49, 13 ,36, 65},
    {52 ,70 ,95 ,23 ,04 ,60 ,11 ,42 ,69 ,24 ,68, 56, 01 ,32 ,56 ,71 ,37 ,2 ,36 ,91},
    {22 ,31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80},
    {24 ,47 ,32 ,60 ,99 ,03 ,45 ,02 ,44 ,75 ,33 ,53 ,78 ,36 ,84 ,20 ,35 ,17 ,12 ,50},
    {32 ,98 ,81 ,28 ,64 ,23, 67 ,10 ,26 ,38 ,40 ,67, 59 ,54 ,70, 66, 18, 38 ,64 ,70},
    {67 ,26 ,20, 68 ,02 ,62, 12 ,20 ,95, 63 ,94 ,39 ,63 ,8, 40, 91, 66, 49 ,94 ,21},
    {24 ,55 ,58, 5 ,66 ,73, 99 ,26 ,97, 17, 78 ,78 ,96 ,83 ,14, 88 ,34, 89 ,63 ,72},
    {21 ,36 ,23, 9 ,75 ,0 ,76 ,44 ,20, 45 ,35 ,14 ,0 ,61 ,33, 97 ,34, 31 ,33 ,95},
    {78, 17 ,53, 28, 22 ,75, 31 ,67, 15, 94 ,3 ,8 ,4 ,62 ,16 ,14 ,9, 53 ,56 ,92},
    {16, 39 ,5, 42 ,96 ,35, 31 ,47 ,55, 58 ,88 ,24 ,0, 17 ,54 ,24 ,36 ,29, 85 ,57},
    {86, 56 ,0, 48, 35 ,71, 89 ,7, 5, 44, 44 ,37 ,44 ,60 ,21 ,58 ,51, 54 ,17 ,58},
    {19, 80 ,81, 68, 05 ,94 ,47 ,69 ,28, 73, 92 ,13, 86, 52 ,17, 77, 4, 89, 55, 40},
    {04, 52, 8, 83, 97 ,35, 99 ,16 ,07, 97 ,57, 32 ,16 ,26 ,26, 79, 33 ,27 ,98, 66},
    {88 ,36 ,68, 87, 57 ,62 ,20 ,72, 3, 46 ,33, 67 ,46 ,55 ,12 ,32, 63, 93 ,53 ,69},
    {4 ,42 ,16, 73 ,38 ,25 ,39 ,11 ,24, 94 ,72 ,18, 8 ,46, 29 ,32, 40, 62 ,76 ,36},
    {20 ,69 ,36, 41, 72 ,30 ,23, 88 ,34 ,62 ,99 ,69, 82 ,67 ,59 ,85, 74 ,4, 36 ,16},
    {20 ,73 ,35 ,29, 78, 31 ,90, 1 ,74 ,31, 49 ,71 ,48 ,86 ,81 ,16, 23, 57 ,5 ,54},
    {1, 70 ,54, 71 ,83, 51 ,54, 69 ,16 ,92 ,33,48 ,61 ,43, 52 ,1 ,89 ,19 ,67 ,48}
    };
    long greatestProduct = 1;

    void checkRows()
    {
        int product = 1;
        for(int row = 0 ;  row < 20;row++)
        {
            for(int col = 0 ; col < 20-3; col++)
            {
                product = a[row][col]*a[row][col+1]*a[row][col+2]*a[row][col+3];
                if(product > greatestProduct)
                {
                    greatestProduct = product;
                }
            }
        }

    }
    void checkColumns()
    {
        int product = 1;
        for(int col = 0 ; col < 20; col++)
        {
            for(int row = 0 ;  row < 20-3; row++)
            {
                product = a[row][col]*a[row+1][col]*a[row+2][col]*a[row+3][col];
                if(product > greatestProduct)
                {
                    greatestProduct = product;
                }
            }
        }
    }
    void checkUpperDiagonals()
    {

        int col =0;
        int col1 = 0;
        int lengthOfDiagonal = 20;
        int n = 20;
        int product,product1;
        while(lengthOfDiagonal>3)
        {
            for(int row = 0; row <lengthOfDiagonal -3; row++)
            {
                product = a[row][col]*a[row+1][col+1]*a[row+2][col+2]*a[row+3][col+3];
                product1 = a[row][n-col-1]*a[row+1][n-col-2]*a[row+2][n-col-3]*a[row+3][n-col-4];
                if(product > greatestProduct)
                {
                    greatestProduct = product;
                }

                if(product1 > greatestProduct)
                {
                    greatestProduct = product1;
                }
            }
            lengthOfDiagonal--;

            col = ++col1;
        }
    }
    void checkLowerDiagonals()
    {
        int row = 1;

        int row1 = 1;
        int lengthOfDiagonal = 19;
        int n = 20;
        int product,product1;
        while(lengthOfDiagonal>3)
        {
            for(int col = 0; col <lengthOfDiagonal -3; col++)
            {
                product = a[row][col]*a[row+1][col+1]*a[row+2][col+2]*a[row+3][col+3];
                product1 = a[row][n-col-1]*a[row+1][n-col-2]*a[row+2][n-col-3]*a[row+3][n-col-4];
                if(product > greatestProduct)
                {
                    greatestProduct = product;
                }

                if(product1 > greatestProduct)
                {
                    greatestProduct = product1;
                }
            }
            lengthOfDiagonal--;

            row = ++row1;

        }

    }
    void result()
    {
        System.out.println("Greatest Product = " +greatestProduct);
    }
    public static void main(String args[])
    {
        LargestProductInAGrid l = new LargestProductInAGrid();
        l.checkRows();
        l.checkColumns();
        l.checkUpperDiagonals();
        l.checkLowerDiagonals();
        l.result();
    }

}

1 个答案:

答案 0 :(得分:1)

你的对角跳棋非常模糊。为什么?它们应该与行和列检查器非常相似。

示例,要检查5x5矩阵中的3个长度,请使用大写字母迭代单元格。 Ooo就是一个例子:

Row: X X X x x   Check two cells to the right
     X X O o o
     X X X x x
     X X X x x
     X X X x x

Column: X X X X X   Check two cells down
        X X X X X
        X O X X X
        x O x x x
        x O x x x

Diagonal Up: x x x o x   Check two cells up-right
             x x o x x
             X O X x x
             X X X x x
             X X X x x

Diagonal Down: X X X x x   Check two cells down-right
               X X X x x
               X O X x x
               x x o x x
               x x x o x

正如您所看到的,它们都非常相似,并且都需要带有两个for循环的简单代码。

如果您需要调试您的代码,那么您要查找的4个数字为87 97 94 89,并且处于对角线向上模式。