質問

オイラー問題18を解決しようとしています-<!> gt; http://projecteuler.net/index.php?section=problems < !> amp; id = 18

C ++でこれを実行しようとしています(再学習しており、オイラーの問題が優れた学習/検索教材になります)

#include <iostream>

using namespace std;

long long unsigned countNums(short,short,short array[][15],short,bool,bool);

int main(int argc,char **argv) {

    long long unsigned max = 0;
    long long unsigned sum;


    short piramide[][15] = {{75,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                            {95,64,0,0,0,0,0,0,0,0,0,0,0,0,0},
                            {17,47,82,0,0,0,0,0,0,0,0,0,0,0,0},
                            {18,35,87,10,0,0,0,0,0,0,0,0,0,0,0},
                            {20,4,82,47,65,0,0,0,0,0,0,0,0,0,0},
                            {19,1,23,75,3,34,0,0,0,0,0,0,0,0,0},
                            {88,2,77,73,7,63,67,0,0,0,0,0,0,0,0},
                            {99,65,4 ,28,6,16,70,92,0,0,0,0,0,0,0},
                            {41,41,26,56,83,40,80,70,33,0,0,0,0,0,0},
                            {41,48,72,33,47,32,37,16,94,29,0,0,0,0,0},
                            {53,71,44,65,25,43,91,52,97,51,14,0,0,0,0},
                            {70,11,33,28,77,73,17,78,39,68,17,57,0,0,0},
                            {91,71,52,38,17,14,91,43,58,50,27,29,48,0,0},
                            {63,66,4,68,89,53,67,30,73,16,69,87,40,31,0},
                            {4,62,98,27,23,9,70,98,73,93,38,53,60,4,23}};

    for (short i = 0;i<15;i++) {
        for (short m=0;m<15;m++) {
            if (piramide[i][m] == 0)
                break;
            sum = countNums(i,m,piramide,15,true,true);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,true,false);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,false,true);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,false,false);
            if (sum > max)
               max = sum;

        }

    }
    cout << max;
    return 0;
}


long long unsigned countNums(short start_x,short start_y,short array[][15],short size, bool goright,bool goright2) {
    long long unsigned currentSum;

    currentSum = array[start_x][start_y];

    if (goright) { //go right
        if ((start_x + 1) < size)
            start_x++;
        if ((start_y + 1) < size)
            start_y++;
    }
    else //go down
        if ((start_x + 1) < size)
            start_x++;

    if (goright2) { //still going right
        for (short i = start_x, m = start_y;i< size && m < size;i++,m++) {
            currentSum += array[i][m];         
        }
    }
    else { //still going down
        for (short i = start_x;i<size;i++) {
            currentSum += array[i][start_y];            
        }
    }

    return currentSum;
}

countNums関数は、下方向または斜め方向に移動するために使用されます。 この関数を次のようにテストしました:

short a = 0;
short b = 0;
cout << countNums(a,b,piramide,15,true,true) << endl;
cout << countNums(a,b,piramide,15,true,false) << endl;
cout << countNums(a,b,piramide,15,false,true) << endl;
cout << countNums(a,b,piramide,15,false,false) << endl;
return 0;

そして、それは動作します(関数を少し変更して、通過したすべての数字を印刷するようにしました)

しかし、まだ正しい結果が得られません。これは下に向かって右に移動し、引き続き右に移動し(隣接する数値は右に移動)、下に移動して下降し続けます(隣接する数値は左に移動します)。 ここで何が間違っていますか?


アラステア:簡単です

long long unsigned countNums(short start_x、short start_y、short array [] [15]、short size、bool goright、bool goright2);

start_xとstart_yは配列の座標です 配列は配列への参照です sizeは配列のサイズです(常に15です)。 gorightは、私が右下に行くのか、それとも下に行くのかを知ることです goright2は、下降を続けるか左に進むかを知ることです

役に立ちましたか?

解決

まず最初に、問題が何であると思うかについて、私は少しわかりません。最後から2番目の文を解析できません...

次に、ここでデザインを再考することをお勧めします。単一の個別のタスクを実行し、アプリケーションの他の部分と絡み合っていない関数について考えてください(つまり、<!> quot;密結合および疎結合<!> quot;を参照してください)。私にとって大きな警告は、非常に汎用的な関数名countNumsの長い引数リストの存在です。

問題をより小さく、より簡単に理解できるチャンクに分割すると、問題を見つけやすくなります。ここで採用するアプローチはわかっていますが、演習の全体のポイントはプログラミングスキルの練習を支援することであると考えているため、そのままにしておきます...

他のヒント

この問題を解決しました。 Project Eulerの性質は自分で問題を解決することであるため(<!> quot;解決済みのクロスワードパズルをコピーしても、それを解決したということではありません<!> quot;)、これを誰かのために台無しにしたくないそれ以外の場合、私が本当に言えるのは、ソリューションが過度に複雑に見えることです。

ただし、ファイルを読んでいるときにこの問題を解決できます。この方法で解決すれば、問題#69は簡単になります!

がんばって!

この問題に少し混乱しています。
コードをクリーンアップすることから始めます。

long long unsigned countNums(short x,
                             short y,
                             short array[][15],
                             short size, 
                             bool goright,
                             bool goright2) 
{
    long long unsigned currentSum;
    currentSum = array[x][y];

    if ((x + 1) < size)    x++; //this happened in both your if cases

    if (goright && ((y + 1) < size)      y++; 

    if (goright2)
    { 
        for (;x< size && y< size;x++,y++)
            currentSum += array[x][y];         

    }
    else 
    {
        for (;x<size;x++) 
            currentSum += array[x][y];            
    }
    return currentSum;
 }

今、私は質問を読みましたが、それがあなたが望むことをしているのかわかりません。 これはあなたが望んでいるものではないので、最初に答えをpsudo-codeすることをお勧めします。 コードを忘れてください。sudoコードの答えは何ですか。
ああ、聖なるものすべての愛のために。 forループに複数の初期化子を入れないでください。私はそのためにフラックを取得するつもりですが、それは面倒で本当に必要ありません。 あなたが検討するかもしれない何かはrecusive機能です。この問題には理想的なようです。

メイン関数は、エントリがゼロではないことを確認しますが、インデックスを再度変更しても、それが呼び出す他の関数はそれを確認しません。私は知りません、あなたが何をしようとしているのか本当に理解していません。

15個の要素に対して配列サイズ15が表示されますが、宣言のインデックスも0から始まりますか?ちょっと確認させてください。念のため、サイズを指定して宣言しますが、0に基づいてアクセスします。良い。

なぜネストされたforステートメントを1箇所使用したが、後でステートメントのcompunded-conditionを使用したのですか? &&の優先順位が<よりも高くないことを確認してください。グループ8はグループ13 こちらを破りました。ステートメントで複数回使用されないインクリメント演算子、それは良いことです。

この問題を別の言語で以前に行ったことがあるようですが、それについてもトレースして、新しいプログラムが最初に異なる場所を見つけることができますか?

他の人たちは正しい、質問は紛らわしい。私はまず、ピラミッドがその時点で開始した場合に最高スコアを与える別のマトリックスにサブスコアを構築する問題を解決し、最下行から最上位に構築することを試みます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top