2

私は別の演習を行っており、次のことを行う必要があります。

「8 クイーンのチェス問題のすべての解を出力する再帰関数を作成し、解の数を返します。関数のプロトタイプは次のようにする必要があります: int function(void)

引数なしの規則を回避するために、静的変数を使用しました。

私は(Googleの助けを借りて)それを行いましたが、動作しますが、ループの使用が許可されておらず、何らかの理由で最後の2つのループをループforに変換できません.forwhile

それは私を夢中にさせます、それは簡単なはずです! それを台無しにするのは再帰だと思います...

作業関数は次のとおりです。

int function()
{
    static int count = 0;
    static int col = 0;
    const int n = 8;
    static int hist[8] = {10, 10, 10, 10, 10, 10, 10, 10};
    int i1 = 0;

    if (col == n) {
        count++;
        while (i1++ < n)
        {
            putchar('0' + hist[i1-1] + 1);
        }
        putchar('\n');
    }

    for (int i = 0; i < n; i++) {
        int j = 0;
        for (j = 0; j < col && !(hist[j] == i || (hist[j] - i) == col - j || -(hist[j] - i) == col - j); j++);

        if (j < col) {
            continue;
        }
        hist[col] = i;
        col++;
        function();
        col--;  
    }
    return count;
}

そして、最後の2つのforループを次のwhileようなループに変換しようとしました:

int i = 0;
while (i < n)
{
    int j = 0;
    while (j < col && !(hist[j] == i || (hist[j] - i) == col - j || -(hist[j] - i) == col - j))
    {
        j++;
    }

    if (j < col) {
        continue;
    }
    hist[col] = i;

    col++;
    function();
    col--;
    i++;
}

しかし、それは機能しません。見た目よりも多くの for ループがありますか? 私は再帰に慣れていないので、理解したと思っていましたが、間違っていたようです...

4

2 に答える 2

1

コードを実行したところ、問題が見つかりました。ライン付きです

if (j < col) {
    continue;
}

これはループにcontinue入るステートメントではないため、この条件でもインクリメントする必要があります。fori

if (j < col) {
    i++;      // add this line
    continue;
}
于 2013-07-21T20:20:48.073 に答える