2013-11-28 20 views
0

我已經用C編寫了這個數獨求解器,但它不能正常工作,有什麼幫助嗎?C中的數獨求解器無法正常工作

隨着作爲

1 0 3 4 0 0 7 0 9 
0 5 6 0 8 9 0 2 3 
0 8 9 1 0 3 4 0 6 
2 1 4 0 6 5 0 9 7 
3 0 0 8 0 7 0 1 4 
8 0 7 0 1 4 0 6 5 
0 3 1 0 4 0 9 7 8 
6 4 0 9 7 0 5 3 1 
0 7 8 0 0 1 0 4 2 

樣本輸入,它使輸出

1 2 3 4 5 6 7 8 9 
7 5 6 0 8 9 1 2 3 
0 8 9 1 2 3 4 5 6 
2 1 4 3 6 5 8 9 7 
3 9 5 8 0 7 2 1 4 
8 0 7 2 1 4 3 6 5 
5 3 1 6 4 2 9 7 8 
6 4 2 9 7 8 5 3 1 
9 7 8 5 3 1 6 4 2 

任何想法出了什麼問題?

#include<stdio.h> 

int sudoku[9][9]; 

int check(int sudoku[][9], int row, int col, int sol) 
{ 
    //checking in the grid 
    int row_grid = (row/3) * 3; 
    int col_grid = (col/3) * 3; 

    int i, j; 
    for(i=0; i<9; ++i) 
    { 
     if (sudoku[row][i] == sol)        
      return 0; 
     if (sudoku[i][col] == sol)        
      return 0; 
     if (sudoku[row_grid + (i%3)][col_grid + (i/3)] == sol) 
      return 0; 
    } 
    return 1; 
} 


int main(void) 
{ 
    int i,j,k; 
    printf("enter the sudoku and enter 0 for unknown entries \n"); 
    for(i=0;i<9;i++) 
    { 
     for (j=0;j<9;j++) 
     { 
      scanf("%d",&sudoku[i][j]); 
     } 
    }  
    for(i=0;i<9;i++) 
    { 
     for (j=0;j<9;j++) 
     { 
      if(sudoku[i][j]==0) 
      { 
       for (k=1;k<=9;k++) 
       { 
        if(check(sudoku,i,j,k)==1) 
        { 
         sudoku[i][j] = k;     
        } 
       }    
      } 
     } 
    } 

    printf("solved sudoku \n"); 
    for(i=0;i<9;i++) 
    { 
     for (j=0;j<9;j++) 
     { 
      printf("%d ", sudoku[i][j]); 
     } 
     printf("\n");  
    } 
    return 0; 
} 
+2

您是否試圖自己調試代碼? – alex

+0

是的,找不到線索。這就是爲什麼我在這裏發佈 – goromlagche

+1

顯示你的意圖,邏輯和你期望的輸出。 – moeCake

回答

0

你不打算用這種方式解決數獨。您只需循環遍歷所有單元格,併爲每個空單元格選擇可以在那裏存在的最大值。顯然,這是不正確的,因爲在一個單元中可能有幾個變體。你總是選擇最大的(因爲在for (k=...)循環中沒有break)。 有時你會選錯號碼,它會使數獨不一致。

更新:你所做的不是暴力破解,因爲你不會遍歷所有可能的解決方案。取而代之的

if(check(sudoku,i,j,k)==1) 
{ 
    sudoku[i][j] = k;     
} 

必須有像

if(check(sudoku,i,j,k)==1) 
{ 
    tempSudoku = copy(sudoku); //pseudocode 
    tempSudoku[i][j] = k; 
    tryToSolveRecursively(tempSudoku);    
} 

如果檢查()返回0,則有一個不一致(對於某些空白單元格,我們無法找到一個可能的解決方案)。所以我們應該放棄這個解決方案,回去嘗試一些其他的東西(viva la recursion :))。 這不是唯一的選擇,但我只是希望它會指出你在一個正確的方向。

P.S.僅基於數獨規則的蠻力解決方案將是極其緩慢。相信我。您需要額外的啓發式方法來減少搜索空間。

+0

感謝男人,任何更好的方式來做到這一點,以擺脫不一致? – goromlagche

+0

@goromlagche,我更新了一個答案。不幸的是,我無法提供關於解決數獨的鏈接,因爲我擁有的所有鏈接都是在俄羅斯:)但我想你可以谷歌幾種技術。 – FreeNickname

+0

不客氣:)我希望它會幫助:) – FreeNickname