0

私はこのコードを数時間見つめ、ウォークスルーを試し、自動とブレークポイントを使用してデバッグしましたが、これまでのところ解決策はありません。たぶん誰かの新鮮な表情が私を助けてくれるでしょう;)。

#include <iostream>

using namespace std;

int matrix[9][9] = {{0, 0, 6, 0, 0, 0, 1, 0, 5},
                    {0, 4, 0, 7, 0, 6, 0, 3, 9},
                    {2, 0, 0, 9, 3, 0, 6, 0, 0},
                    {7, 0, 0, 1, 8, 0, 5, 0, 4},
                    {0, 0, 4, 0, 6, 0, 9, 0, 0},
                    {1, 0, 9, 0, 5, 2, 0, 0, 3},
                    {0, 0, 1, 0, 9, 3, 0, 0, 7},
                    {6, 7, 0, 5, 0, 8, 0, 9, 0},
                    {9, 0, 8, 0, 0, 0, 4, 0, 0}};


bool check(int column  ,int row,int checkedValue) 
{
    //column check
    for(int i=0; i<9; i++) 
    {       
        if(i==row)continue;

        if(checkedValue==matrix[column][i]) return false;
    }
    //row check 
    for(int i=0; i<9; i++) 
    {   
        if(i==column) continue;
        if(checkedValue==matrix[i][row]) return false;
    }                       
        return true;
}   



int main()
{
    cout<<check(4,0,4); //Why does it output 0? There is no "4" in the 5th column and the 1st row.

    system("pause");
    return 0;
}

関数check(column、row、value)は、「行列」の2次元テーブルで数値が少なくとも1回発生したときに、0を返すように設計されています。このプログラムは数独ソルバーのチャンクです。

4

1 に答える 1

3

ifステートメントでインデックスを混ぜ合わせました。彼らはする必要があります:

if(checkedValue==matrix[i][column]) return false; // not matrix[column][i]

if(checkedValue==matrix[row][i]) return false;    // not matrix[i][row]

その理由は、最初の次元が行であるためです。これは、を印刷することで確認できますmatrix[2][0]
マトリックスの場合、2(6ではなく)が得られます。

于 2012-06-24T12:27:14.163 に答える