2017-12-17 20 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 차원 배열을 생성하는 것이 더 효율적이고 쉬운 방법이 있습니까? 코드가 작동하지만 실행 시간이 너무 길어 아마도 많은 루프가 원인 일 수 있습니다. 또한 나는 초심자 (1 학년 cs 학생)이므로 이것이 복잡한 알고리즘을 수행하는 방법을 모르기 때문에 내가 별개로 생각할 수있는 유일한 방법입니다 (예, 어리 석고 비효율적이며 잘못되었음을 알고 있습니다).행과 열 사이에 고유 번호가있는 2 차원 배열을 생성하려면 어떻게합니까?

편집 : generateRandNum :

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

generateRandNum의 본문을 게시 할 수 있습니까? – Angen

+0

메인 포스트에 게시 된 –

+0

for 루프의 genRandNum은 시간 낭비입니다. 왜 그걸 가지고 있습니까? 이 함수는 하나의 숫자 만 반환하고 모두를 반환하지는 않습니다. – 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; 
}