我正在嘗試解決這個問題:https ://projecteuler.net/problem=11 但是,這部分讓我感到困惑:
在 20×20 的網格中,沿相同方向(上、下、左、右或對角線)的四個相鄰數字的最大乘積是多少?
是什么in the same direction意思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;
有了這個功能,我滿足了第一個需求,但從左到右還是對角線?是什么or意思?
uj5u.com熱心網友回復:
網格背景關系中的方向是所有點都在同一條線上的幾何空間。
如果我們取一個點,那么我們可以用 4 條不同的線穿過它:
\ | /
\ | /
\ | /
\|/
----*----
/|\
/ | \
/ | \
/ | \
那么,我們如何定義這些方向呢?有一個非常簡單的方法可以做到這一點:
- 你回圈行
- 你回圈列
- 在當前點,您嘗試獲取 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;
}
}
這不是一個完整的實作,因為您還需要做一些作業。您將需要繼續:
- 將第二個回圈的內部部分轉換為一個函式,除了
if檢查產品是否高于迄今為止最好的產品的條件 - 洗掉該內部代碼并將其替換為函式呼叫
- 再呼叫該函式三次,每個方向一次
- 其他方向是:
- 1:有 1
colDir和 0rowDir - 2:有 1
colDir和 1rowDir - 3:有 1
colDir和 -1rowDir
- 1:有 1
我知道考慮這個部分解決方案比較困難,但是從長遠來看,如果您自己完成其余的作業,它將對您有很大幫助,因為這些想法都在這里列出。
uj5u.com熱心網友回復:
您需要檢查 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)
一定要注意網格邊,就好像你在最左邊一樣,你需要向右看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451622.html
上一篇:std::shared_ptr<T>.use_counter()的問題
下一篇:在R中創建單詞變體
