簡體   English   中英

無法理解問題的要求。 (ProjectEuler 問題:11)

[英]Can't understand the requirement of the problem. (ProjectEuler problem: 11)

我正在嘗試解決這個問題: https://projecteuler.net/problem=11但是,這部分讓我感到困惑:

在 20×20 的方格中,同一方向(上、下、左、右、對角線)的四個相鄰數字的最大乘積是多少?

in the same direction and up, down, left, right or diagonally是什么意思? 只是我還是這里的語言含糊不清?

到目前為止,這是我嘗試過的:

long int prod{0}, n{20};

for(int i{0}; i <= n; i++) {
    for(int j{0}; j <= n; j++) {
        long int a{grid[i][j]}, b{grid[i+1][j+1]}, c{grid[i+2][j+2]}, d{grid[i+3][j+3]};
        if(prod < (a * b * c * d))
            prod = a * b * c * d;
    }
}

return prod;

有了這個 function,我滿足了第一個需求,但從左到右還是對角線? 那里是or意思?

網格上下文中的方向是所有點都在同一條線上的幾何空間。

如果我們取一個點,那么我們可以用 4 條不同的線穿過它:

\   |   /
 \  |  /
  \ | /
   \|/
----*----
   /|\
  / | \
 /  |  \
/   |   \

那么,我們如何定義這些方向呢? 有一種非常簡單的方法可以做到這一點:

  • 你循環行
    • 你循環列
      • 在當前點,你嘗試獲取4個值,包括當前點
        • 向下
        • 向右
        • 右下
        • 右上

我說“嘗試”,這意味着由於網格的邊界,您將不得不忽略很多可能性。 然而,這是獲得所有四個方向的巧妙方法:

int bestProduct = -1; //Assuming you have positives
for (int row = 0; row < n; row++) {
    for (int column = 0; column < n; column++) {
        int ignore = 0;
        int rowDir = 0;
        int colDir = 1;
        int product = grid[row][column];
        for (int index = 0; (!ignore) && (index < 3); index++) {
            if (
                   (row + rowDir < 0) ||
                   (row + rowDir >= n) ||
                   (column + colDir < 0) ||
                   (column + colDir >= m)
               ) {
                ignore = 1;
            }
            else product *= grid[row + rowDir][column + colDir];
        }
        if ((!ignore) && (bestProduct < product)) bestProduct = product;
    }
}

這不是一個完整的實現,因為您還需要做一些工作。 您將需要繼續:

  • 將第二個循環的內部部分轉換為 function 除了if條件檢查產品是否高於目前為止最好的產品
  • 刪除該內部代碼並將其替換為 function 調用
  • 再撥3次function,一次互換方向
  • 其他方向是:
    • 1:有 1 個colDir和 0 rowDir
    • 2:有 1 個colDir和 1 個rowDir
    • 3:有一個 1 colDir和 -1 rowDir

我知道考慮這個部分解決方案比較困難,但如果你自己做 rest 從長遠來看,它會對你有很大幫助,因為所有的想法都在這里。

您需要檢查 4 的每一行、每一列和對角線。這意味着您需要檢查:

from grid[i-4][j] to grid[i][j]  
from grid[i][j-4] to grid[i][j]  
from grid[i-4][j-4] to grid[i][j] (diagonal) 
from grid[i+4][j-4] to grid[i][j] (other diagonal)

一定要注意網格的兩側,就好像你在最左邊一樣,你需要向右看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM