2017-12-17 16 views
0
void generateSudoku(int sudoku[][C]) 
      { 
       for (int i = 0; i < R; i++) 
       { 
        for (int j = 0; j < C; j++) 
        { 
         sudoku[i][j] = generateRandNum(); //generate random number for all 2d array 
         while (sudoku[1][0] == sudoku[0][0] || sudoku[2][0] == sudoku[1][0] || sudoku[2][0] == sudoku[0][0] 
          || sudoku[3][0] == sudoku[2][0] || sudoku[3][0] == sudoku[1][0] || sudoku[3][0] == sudoku[0][0]) 
          sudoku[i][j] = generateRandNum(); 
         while ( sudoku[i][1] == sudoku[i][0] || sudoku[1][1] == sudoku[0][1] || sudoku[2][1] == sudoku[1][1] 
           || sudoku[2][1] == sudoku[0][1] || sudoku[3][1] == sudoku[2][1] || sudoku[3][1] == sudoku[1][1] 
           || sudoku[3][1] == sudoku[0][1]) //index 1 to index 0 
          sudoku[i][j] = generateRandNum(); 
         while ((sudoku[i][2] == sudoku[i][0]) || (sudoku[i][2] == sudoku[i][1]) || sudoku[1][2] == sudoku[0][2] 
           || sudoku[2][2] == sudoku[1][2] || sudoku[2][2] == sudoku[0][2] || sudoku[3][2] == sudoku[2][2] 
           || sudoku[3][2] == sudoku[1][2] || sudoku[3][2] == sudoku[0][2]) 
          sudoku[i][j] = generateRandNum(); 
         while ((sudoku[i][3] == sudoku[i][0]) || (sudoku[i][3] == sudoku[i][1]) || (sudoku[i][3] == sudoku[i][2])) //index 3 to index 2,1,0 
          sudoku[i][j] = generateRandNum(); 
        } 

       } 
      } 

2次元配列を乱数で生成する方が、より効率的で簡単な方法があります。これは、各列と行ごとに独特のものですか?コードは機能しますが、実行時間が長すぎます。おそらくは非常に多くのループが原因です。また、私は初心者です(初年度のcs学生)ので、私は複雑なアルゴリズムを行う方法がわからないので、私はそれを明確にするために考えることができる唯一の方法です(ええと私はその愚かで非効率的で間違っていることを知っています)。行と列の間に異なる番号を持つ2次元配列を生成するにはどうすればよいですか?

EDIT:generateRandNum:

int generateRandNum() 
{ 
    int randNum; 
    randNum = (rand() % 4)+1; 
    return randNum; 
} 
+0

generateRandNumの本文を投稿できますか? – Angen

+0

メインポスト –

+0

に投稿されたgenRandNumのループは時間の無駄ですが、なぜあなたはそれを持っていますか?この関数は1つの数値だけを返し、すべてを返しません20 – Angen

答えて

0

私はこれが役に立つかどうかわかりませんが、私は完全な数独パズルを生成するために、別のthreadに単純なアルゴリズムを発見しました。詳細については、このスレッドをチェックしてください。これは私のこのアルゴリズムの短い実装です:

std::array <unsigned int, 9> seed = {8, 9, 3, 2, 7, 6, 4, 5, 1}; 

std::array <std::array <unsigned int, 9>, 9> generate(std::array 
    <unsigned int, 9> seed) 
{ 
    unsigned int seedOffset {0}; 
    std::array <std::array <unsigned int, 9>, 9> field; 

    field.at(0) = seed; 

    for(unsigned int fieldIndex {1}; fieldIndex < field.size(); ++fieldIndex) 
    { 
     seedOffset = (0 == (fieldIndex % 3)) ? 1 : 3; 
     std::rotate(seed.begin(), seed.begin() + seedOffset, seed.end()); 
     field.at(fieldIndex) = seed; 
    } 

    return field; 
} 
関連する問題