[Project Euler]加入歐拉 Problem 11

來源:互聯網
上載者:User

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 any direction (up, down, left, right, or diagonally) in the 20×20 grid?

 

求這20*20矩陣裡面相鄰的四個數,最大的乘積。

相鄰包括,上下,左右,對角這些位置。

 

思路:

一,將字串轉換為對應的二維的整形數組。

二,對於二維數組裡面的每個一個點,求解這幾個方向關聯的四個值。

以這個點為起點的四個方向(注意這裡用四個方向,而不是8個方向,可以避免重複計算。)

右上對角

右下對角

右邊

下面

如果其中任何一邊不足4個元素(包括這個點本身),就以0為值。

比較這4個值裡面最大的值。

這樣對應於每個點,都存在這樣一個值。

三,遍曆二維數組,比較各個點最大值的最大值。也就是矩陣的最大值了。

 

裡面有幾個需要注意的地方:

一,如何將這個字串轉換為對應二維數組。

二,如何求解對應每個點的最大值。

三,要求瞭解多維陣列的參數傳遞。

歐拉項目第十一題#include <stdio.h>#include <stdlib.h>// 分析矩陣中每個點帶動的周圍的四個方向的乘積的最大值// 四個方向分別為 右上對角線, 向右, 右下對角線, 向下 // 參數 i, j 分別為對應座標 , 傳回值為 i, j 座標組應的四個方向裡面的最大值unsigned long pointMax(int (*arr)[], int i, int j);  int main(int argc, char *argv[]){        char *p = "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";        int arr[20][20];        int row = 0, col = 1;  // 將字串轉換到整形數組中        while(*p != '\0')    {        if(col % 21 != 0)        {            arr[row][col - 1] = (*p - 48) * 10 + *(p + 1) - 48;            col ++;            if((row == 19) && (col == 21))            {                break;            }            else            p += 3;        }        else        {            row++;            col = 1;        }    }        int showrow = 0, showcol = 0;  // 顯示二維數組     for(showrow = 0; showrow < 20; showrow ++)      for(showcol = 1; showcol < 21; showcol++)      {          printf("%3d", arr[showrow][showcol - 1]);          if(showcol % 20 == 0)          printf("\n");      }          unsigned long max = 0;    row = 0, col = 0;    for(row = 0 ; row < 20; row++)      for(col = 0; col < 20; col++)      {          unsigned long tmp = pointMax(arr, row, col);          if(tmp > max)          max = tmp;      }          printf("%lu\n", max);    system("PAUSE");  return 0;}unsigned long pointMax(int (*arr)[20], int i, int j){    unsigned long maxArr[4]; // 臨時數組存放來自4個方向的值    unsigned long max = 0;        if(i >= 3 && j <= 16) // 判斷右上方的3個元素是不是都存在     {        maxArr[0] = arr[i - 1][j + 1] * arr[i - 2][j + 2] * arr[i - 3][j + 3] * arr[i][j];    }    else    {        maxArr[0] = 0;    }        if(j <= 16) // 判斷右邊的3個元素     {        maxArr[1] = arr[i][j] * arr[i][j + 1] * arr[i][j + 2] * arr[i][j + 3];    }    else    {        maxArr[1] = 0;    }        if(i <= 16 && j <= 16) // 判斷右下角的3個元素     {        maxArr[2] = arr[i + 1][j + 1] * arr[i + 2][j + 2] * arr[i + 3][j + 3] * arr[i][j];    }    else    {        maxArr[2] = 0;    }        if(i <= 16) // 判斷下方的3個元素     {        maxArr[3] = arr[i + 1][j] * arr[i + 2][j] * arr[i + 3][j] * arr[i][j];    }    else    {        maxArr[3] = 0;    }        int k;    for(k = 0; k <4; k++)    {        if(maxArr[k] > max)        max = maxArr[k];    }        return max;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.