1

私は学校の宿題のためにJavaでノングラムソルバを書こうとしています。これは、1つを除くすべての入力に対して機能します。私のコードはgithubにありますhttps://github.com/farkadav/Nonogram-solverノングラムソルバのバックトラックが無限ループになっているようです

CSPSolver私はノングラムを解きます。私はすべての可能な行/列の組み合わせを生成し、github上のテキストファイルにある制約を与えてから、アークの一貫性をチェックしてから、バックトラックによって解決策を見つけようとしています。私はそれがどのように解決されるべきかを出力しています。私がdino.txtを解こうとすると、私のバックトラック関数は11行目とcolと15列を解く無限ループになるようです。ここにそのメソッドのコードがあります。

public void backtracking(){ 

    if(orderedVars.isEmpty()){ 

     String[] solString = new String[rowDim]; 
     for(Line line : rowSolution){ 

      solString[line.position] = new String(); 
      for(int j=0; j<colDim; j++){ 
       solString[line.position] +=line.value[j]; 
      } 

     } 
     String solution = new String(); 
     for(String sol : solString){ 
      solution += sol +"\n"; 
     } 
     solutions.add(solution); 
     return; 
    } 
    CSPVariable cspVar = orderedVars.poll(); 


    for(char[] var : cspVar.storage){ 
     if(consistent(var,cspVar)){ 

      if(cspVar.Row){     
       rowSolution[helpX++] = new Line(var,cspVar.position,cspVar.Row);      
       backtracking(); 
       rowSolution[--helpX] = null; 
      } else{ 
       colSolution[helpY++] = new Line(var,cspVar.position,cspVar.Row);      
       backtracking(); 
       colSolution[--helpY] = null; 
      } 
     } 
    } 
    orderedVars.add(cspVar); 

} 

私はそれが正確に何を引き起こしているのかわかりませんが、どんな助けもありがたいです。何か不明な点がある場合は、こちらへのリンクですhttp://cw.fel.cvut.cz/wiki/courses/a4b33zui/task2-malovane-krizovky-en

答えて

0

helpXとhelpYを操作してbacktracking()を呼び出すと疑問に思われます。アルゴリズムの定義からそのように並べ替えることが必要でない場合、そのようなhelpXとhelpYは、backtracking()が呼び出される前に変更されます。

+0

私は恐れてアルゴリズムの定義から必要です。しかし、私は間違っている可能性があります。とにかく...とにかく試してみると、プログラム全体がクラッシュします。提案ありがとう :) – lobito

関連する問題