0

20x20 グリッド内の4 つの隣接する数値 (整数) の中で最大の積を計算しようとしています。

これは私がこれまでに持っているものです...

/**
 * The maxProduct method is used to compute the largest product across four 
 * consecutive integers (either horizontally, vertically, or diagonally).
 * 
 * @param gridData    - A 20x20 array containing the integer values.
 * @return maxProduct - The largest product.
 */
private static int maxProduct(int[][] gridData)
{
    int maxProduct = 0;
    int currentProduct = 0;

    // Compute the products across the columns.
    for (int row = 0; row < 20; row++)
        for (int column = 0; column < 17; column++)
        {
            currentProduct = gridData[row][column] 
                    * gridData[row][column + 1] * gridData[row][column + 2] 
                    * gridData[row][column + 3];

            if (currentProduct > maxProduct)
            {
                maxProduct = currentProduct;
            }

        }

    // Compute the products across the rows.
    for (int column = 0; column < 20; column++)
        for (int row = 0; row < 17; row++)
        {
            currentProduct = gridData[row][column]
                    * gridData[row + 1][column] * gridData[row + 2][column]
                    * gridData[row + 3][column];

            if (currentProduct > maxProduct)
            {
                maxProduct = currentProduct;
            }
        }

    // Compute the products across the right diagonals.
    for (int column = 0; column < 17; column++)
        for (int row = 0; row < 17; row++)
        {
            currentProduct = gridData[row][column]
                    * gridData[row + 1][column + 1]
                    * gridData[row + 2][column + 2]
                    * gridData[row + 3][column + 3];

            if (currentProduct > maxProduct)
            {
                maxProduct = currentProduct;
            }

        }


    // Compute the products across the left diagonals.
    for (int column = 19; column < 3; column--)
        for (int row = 0; row < 17; row++)
        {
            currentProduct = gridData[row][column]
                    * gridData[row + 1][column - 1]
                    * gridData[row + 2][column - 2]
                    * gridData[row + 3][column - 3]; 

            if (currentProduct > maxProduct)
            {
                maxProduct = currentProduct;
            }
        }

    return maxProduct;
}

このコードを別のプロジェクトからコピーしました (たまたま 8x8 グリッドを使用した Connect 4 ゲームでした)。どうやら、Connect 4 ゲームのコードが機能しなかったようです。私の左の対角線はテスト ケースに失敗しました。この方法で問題を解決できたと確信しています。

機能は (積を計算する限り) 同じである必要がありますが、正しい値が見つかりません。

私の論理はどこが間違っていますか?

4

2 に答える 2

3

私が見る問題は、次の行にあります。

for (int column = 19; column < 3; column--)

これはfalse最初から実行され、ブロックは実行されません。あなたはおそらく必要です

for (int column = 19; column >= 3; column--)

>=の最後の有効な値columnが 3になるように使用します (したがって にcolumn - 3評価され0、左側に到達します)。

于 2013-05-17T00:02:12.280 に答える
2

このサイクルは間違っているようcolumn = 19; column < 3; column--です。単一の反復を実行することは決してありません。多分あなたは意味しましたcolumn > 3か?

于 2013-05-17T00:01:21.700 に答える