2012-03-16 11 views
5

का उपयोग कर सुडोकू सॉल्वर हाल ही में मैं बैकट्रैकिंग सुडोकू सुलझाने वाले एल्गोरिदम पर काम कर रहा हूं और वर्तमान में मैं यह पूछना चाहता हूं कि मुझे अपनी हल() विधि को शून्य से बूलियन में बदलने के लिए कैसे जाना चाहिए।बैकट्रैकिंग

मैं एक बहुत ही सरल बैक ट्रैकिंग एल्गोरिथ्म का उपयोग कर रहा हूँ, और यह वर्तमान में ठीक काम कर रहा है, लेकिन मैं नहीं बल्कि, एक शून्य के बजाय एक बूलियन होगा क्योंकि एक printstack नहीं होने बहुत अच्छा है ...

धन्यवाद !

public class Backtracking{ 


static int backtrack = 0; 


//check if valid in row 
protected static boolean validInRow(int row, int value) 
{ 
    for(int col = 0; col < 9; col++) 
    if(board[row][col] == value) 
     return false ; 

    return true ; 
} 

    //check if valid in column 
protected static boolean validInCol(int col, int value) 
{ 
    for(int row = 0; row < 9; row++) 
    if(board[row][col] == value) 
     return false ; 

    return true ; 
} 

//check if valid in 3*3 
protected static boolean validInBlock(int row, int col, int value) 
{ 
    row = (row/3) * 3 ; 
    col = (col/3) * 3 ; 

    for(int r = 0; r < 3; r++) 
     for(int c = 0; c < 3; c++) 
     if(board[row+r][col+c] == value) 
     return false ; 

    return true ; 
} 




     //call other methods 
public void solve(int row, int col) throws Exception 
{ 

    if(row > 8) 
    throw new Exception("Solution found") ; 
    else 
    { 

    while(board[row][col] != 0) 
    { 
     if(++col > 8) 
     { 
      col = 0 ; 
      row++ ; 


      if(row > 8) 
       throw new Exception("Solution found") ; 
     } 
    } 


    for(int value = 1; value < 10; value++) 
    { 
     if(validInRow(row,value) && validInCol(col,value) && validInBlock(row,col,value)) 
     { 
      board[row][col] = value; 
      new PrintEvent(board); 



      if(col < 8) 
       solve(row, col + 1); 
      else 
       solve(row + 1, 0); 

      backtrack++; 
     } 
     } 


     board[row][col] = 0; 

     } 
    } 
} 

उत्तर

4

ठीक है, आप अपवाद स्टैक ट्रेस से बचने के लिए catch सकता है, लेकिन है कि अभी भी बहुत सुंदर नहीं है। क्या आप boolean को वापसी प्रकार बदलने के बाद क्या कर सकते हैं:

 if(col < 8) { 
      if (solve(row, col + 1)) { 
       return true; 
      } 
     } else { 
      if (solve(row + 1, 0)) { 
       return true; 
      } 
     } 

और फिर जाहिर है, return true; को throw बयान बदल जाते हैं।

+0

+1 प्रयास करने के लिए +1। मैंने कुछ प्रोग्रामिंग प्रतियोगिताओं की है जहां मैंने बैकट्रैकिंग के लिए प्रयास-पकड़ सिद्धांत का उपयोग किया था। यह एक सुरुचिपूर्ण हैक नहीं है लेकिन यह बहुत उपयोगी है। –

+0

धन्यवाद मेरे दोस्त के लिए, मैंने इसे कई बार बदलने की कोशिश की, लेकिन हमेशा व्यर्थ में (ऐसा लगता है जैसे मैं वापसी विवरणों को गड़बड़ कर रहा था)। मैंने वही किया जो आपने किया था और यह एक आकर्षण की तरह काम करता है! – kompsci

0
public boolean solve(int row, int col) throws Exception 
{ 
    { 

    while(board[row][col] != 0) 
    { 
     if(++col > 8) 
     { 
      col = 0 ; 
      row++ ; 


      if(row > 8) 
      return true 
     } 
    } 


    for(int value = 1; value < 10; value++) 
    { 
     if(validInRow(row,value) && validInCol(col,value) && validInBlock(row,col,value)) 
     { 
      board[row][col] = value; 
      new PrintEvent(board); 



      if(col < 8) 
       solve(row, col + 1); 
      else 
       solve(row + 1, 0); 

      backtrack++; 
     } 
     } 


     board[row][col] = 0; 

     } 
    } 
return false; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे