zoukankan      html  css  js  c++  java
  • Project Euler Problem 11: Largest product in a grid

    Largest product in a grid

    Problem 11

    In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

    08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
    49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
    81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
    52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 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 08 40 91 66 49 94 21
    24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
    21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
    78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
    16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
    86 56 00 48 35 71 89 07 05 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 04 89 55 40
    04 52 08 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 03 46 33 67 46 55 12 32 63 93 53 69
    04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
    20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
    20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
    01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

    The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

    What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?


    C++(Faster):

    #include <iostream>
    
    using namespace std;
    
    const int MAXN = 20;
    const int TWO = 2;
    const int FOUR = 4;
    
    int grid[MAXN][MAXN];
    int product2[MAXN][MAXN];
    
    int main()
    {
        int maxproduct = 0, temp;
    
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN; j++)
                cin >> grid[i][j];
    
        for(int i=0; i<MAXN-TWO; i++)
            for(int j=0; j<MAXN-TWO; j++)
                product2[i][j] = grid[i][j] * grid[i+1][j+1];
        for(int i=0; i<MAXN-FOUR; i++)
            for(int j=0; j<MAXN-FOUR; j++) {
                temp = product2[i][j] * product2[i+2][j+2];
                if(temp > maxproduct)
                    maxproduct = temp;
            }
    
        for(int i=0; i<MAXN-TWO; i++)
            for(int j=0; j<MAXN-TWO; j++)
                product2[i][j] = grid[i][j+3] * grid[i+1][j+2];
        for(int i=0; i<MAXN-FOUR; i++)
            for(int j=0; j<MAXN-FOUR; j++) {
                temp = product2[i][j+3] * product2[i+2][j+1];
                if(temp > maxproduct)
                    maxproduct = temp;
            }
    
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN-TWO; j++)
                product2[i][j] = grid[i][j] * grid[i][j+1];
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN-FOUR; j++) {
                temp = product2[i][j] * product2[i][j+2];
                if(temp > maxproduct)
                    maxproduct = temp;
            }
    
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN-TWO; j++)
                product2[j][i] = grid[j][i] * grid[j][i+1];
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN-FOUR; j++) {
                temp = product2[j][i] * product2[j][i+2];
                if(temp > maxproduct)
                    maxproduct = temp;
            }
    
        cout << maxproduct << endl;
    
        return 0;
    }



    C++:

    #include <iostream>
    
    using namespace std;
    
    const int MAXN = 20;
    const int FOUR = 4;
    
    int grid[MAXN][MAXN];
    
    int main()
    {
        int maxproduct = 0, temp;
    
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN; j++)
                cin >> grid[i][j];
    
        for(int i=0; i<MAXN-FOUR; i++)
            for(int j=0; j<MAXN-FOUR; j++) {
                temp = grid[i][j] * grid[i+1][j+1] * grid[i+2][j+2] * grid[i+3][j+3];
                if(temp > maxproduct)
                    maxproduct = temp;
    
                temp = grid[i][j+3] * grid[i+1][j+2] * grid[i+2][j+1] * grid[i+3][j];
                if(temp > maxproduct)
                    maxproduct = temp;
            }
    
        for(int i=0; i<MAXN; i++)
            for(int j=0; j<MAXN-FOUR; j++) {
                temp = grid[i][j] * grid[i][j+1] * grid[i][j+2] * grid[i][j+3];
                if(temp > maxproduct)
                    maxproduct = temp;
    
                temp = grid[j][i] * grid[j][i+1] * grid[j][i+2] * grid[j][i+3];
                if(temp > maxproduct)
                    maxproduct = temp;
            }
    
        cout << maxproduct << endl;
    
        return 0;
    }


    Input data:

    08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
    49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
    81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
    52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 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 08 40 91 66 49 94 21
    24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
    21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
    78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
    16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
    86 56 00 48 35 71 89 07 05 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 04 89 55 40
    04 52 08 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 03 46 33 67 46 55 12 32 63 93 53 69
    04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
    20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
    20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
    01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48




  • 相关阅读:
    重温集合
    REST接口
    分布式与集群
    桶排序思想与高频面试题---相邻两数最大插值(maxGap)
    八大基本排序---堆排序、堆结构
    八大基本排序---快速排序(经典快排、随机快排)(荷兰国旗问题)
    20.栈中最小元素的min函数
    小和问题、逆序对问题
    接口--Comparable接口【哈夫曼树】
    八大基本排序--堆排序
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564027.html
Copyright © 2011-2022 走看看