2014-01-08 4 views
-3

C 언어로 작성된 Sudoku에서 문제를 해결하기 위해 여기 인터넷에서 함수를 발견했습니다. 거의 모든 작업을 수행했지만 여기 붙어있어 3x3 상자를 확인할 수 없습니다. 위로 여기Sudoku 3x3 상자가 C에서 중복인지 확인

/** 
* Check if a value contains in its 3x3 box for a cell. 
* @param row current row index. 
* @param col current column index. 
* @return true if this cell is incorrect or duplicated in its 3x3 box. 
*/ 
private boolean containedIn3x3Box(int row, int col, int value) { 
    // Find the top left of its 3x3 box to start validating from 
    int startRow = row/3 * 3; 
    int startCol = col/3 * 3; 

    // Check within its 3x3 box except its cell 
    for (int i = startRow; i < startRow + 3; i++) 
     for (int j = startCol; j < startCol + 3; j++) { 
      if (!(i == row && j == col)) { 
       if (cells[i][j] == value){ 
        return true; 
       } 
      } 
     } 

    return false; 
} 

을하는 기능이며, 여기 내 프로그램에 넣어 : 값이 중복 나는이 기능을했다 및 프로그램을 이해하려고 어디 웹 사이트에 읽고

int valid(int k, int ii, int jj) 
{ 
    int i,start,final,j; 
    start=ii/3*3; 
    final=jj/3*3; 
    for(i = 1; i <= 9; ++i) { 
     if (i != ii && v[i][jj] == k) 
      return 0; 
     if (i != jj && v[ii][i] == k) 
      return 0; 
    } 
    for(i=start;i<=start+3;i++) 
     for(j=final;j<=final+3;j++) 
     { 
      if(!(i==ii && j==jj)) 
      { 
       if(v[i][j]==k) 
       return 0; 
      } 
     } 
    return 1; 
} 

. 프로그램은 값과 값을 비교합니다. 내 루프가 잘 작동하지 않습니다.

+0

:

당신은 이중 루프에 하한을 변경 놓친? 나는'if (i! = jj && v [ii] [i] == k)'여기서 행 대신에 값을 비교한다고 생각한다. – SaurabhJinturkar

+0

질문을 명확하게 작성하십시오. 일부 코드에 대한 설명이 필요한 것 같지만 어떤 코드를 혼동하는지 분명하지 않습니다. – anatolyg

+0

첫 번째 루프부터 행/열림을 위해 다음을 확인하십시오. 상자 3x3 확인을위한 것이고 첫 번째 기능에서부터 번역되었습니다. –

답변

0

루프 시작 및 종료 값에 문제가 있습니다.

이 예제에서는 0부터 시작하는 카운트를 사용합니다. 세 개의 세 쌍은 인덱스 (0,1,2) (3,4,5) (6,7,8)를가집니다. 1 기반 루프를 사용하려고합니다. 유효한 기능에서 두 개의 루프를 사용하는 이유는

int valid(int k, int ii, int jj) 
{ 
    int i,start,final,j; 
    start=ii/3*3; 
    final=jj/3*3; 
    for(i = 1; i <= 9; ++i) { 
     if (i != ii && v[i][jj] == k) 
      return 0; 
     if (i != jj && v[ii][i] == k) 
      return 0; 
    } 
    for(i=start+1;i<=start+3;i++)    // Changed lower limit 
     for(j=final+1;j<=final+3;j++)   // Changed lower limit 
     { 
      if(!(i==ii && j==jj)) 
      { 
       if(v[i][j]==k) 
       return 0; 
      } 
     } 
    return 1; 
} 
+0

그것은 1에서 9로가는 0에서 가지 않을거야 내가 편집 한 0에서 시작하지 않습니다 ... –

+0

'containedIn3x3Box' 그것은 0으로 시작됩니다. 내 대답을 1로 시작되도록 수정하겠습니다. –

+0

저를 아주 많이 도와주세요 ... 그리고 그것은 i = 시작해야하고 저는 <+ = start + 2가 아니라 +3 –