0

私のタイトルは少し混乱していますが、異なる名前の 81 個の配列の値を変更するループを記述しようとしています。値または値の配列で配列を開始したい。うまく説明できていないと思うので、これは私の数独ソルバー コードの一部です。

int cell1[], cell2[9], cell3[9],cell4[9]......cell81[9]; // <-- this will make 81 cells with an array that can hold a possible of 9 candidates

cout << "User input: << endl; // lets use ...1.5...14....67..8...24...63.7..1.9.......3.1..9.52...72...8..26....35...4.9...
                              // as an example

その入力を Char 配列に格納し、ループを使用して、指定された値または '.' を開始するかどうかを決定するとします。空の値として。

空の値については、配列を 1 ~ 9 の値で初期化しようとしています。このコードでこれを簡単に行うことができます。

If( ( (int)charArray[ 0 ] - 48) > 0 ) {   // type cast to int. Neg = initialize array with 1-9
                                         // pos = initialize with original value

cell1[ 0 ] =  (int)charArray[ 0 ] - 48;
} else {

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

このコードを 81 個のセルに対して 81 回書くことは避けたい (ジャンク コードを書くと見なされる)。ループの書き方がわかりません。クラス、関数などを使用して、これをさまざまにコーディングする方法についての提案をお待ちしています。よろしくお願いします。

4

2 に答える 2

3

cell81 行 9 列の 2 次元配列として配列を作成します。

int cell[81][9];

これで、構文 を使用してそれらをループできますcell[r][c]。例えば、

for( i = 0; i < 81; ++i ) {
  cell[i][0] = 1;
  // ...
  cell[i][8] = 9;
}

2 次元配列を避けたい場合は、配列を 1 次元配列として宣言し、適切にインデックスを付けることができます。

int cell[81 * 9];

for( i = 0; i < 81; ++i ) {
  cell[i + 0*81] = 1;
  // ...
  cell[i + 8*81] = 9;
}
于 2012-10-25T05:06:17.637 に答える
1
int a1[9],a2[9],a3[9],a4[9],...

void init_array(int *ptr, const char *chr, int len, int start){
  for(int i = start; i < len; i++){
     if(chr[i] == '.')continue;
     ptr[i] = chr[i]-'0';//converts character to integer.
  }
}

int main(int argc, char **argv)
{
    std::string str;
    cin >> str;
    init_array(a1,str.c_str(),9,0); init_array(a2,str.c_str(),9,9/*increment by 9*/);...
    //.. 
    return 0;
}

init_array()整数ポインターを受け取り、配列を初期化する関数を作成します。この方法でコードの重複を避けることができます。

于 2012-10-25T05:09:03.403 に答える