2016-06-14 10 views
0

私のknight's tour codeで誰かが間違いを見つけられますか?私はそれを見つけるように見えることはできません、と私は、ないスタックオーバーフローナイトツアー回帰

private bool heuristic(int[,] board, int x, int y, ref int jmp) 
{ 
    if (x < 0 || x > 7 || y < 0 || y > 7 || board[x, y] > 0) 
     return false; 
    board[x, y] = ++jmp; 
    if (jmp == 64) 
     return true; 

    if (heuristic(board, x + 2, y + 1, ref jmp) || 
     heuristic(board, x + 2, y - 1, ref jmp) || heuristic(board, x - 2, y + 1, ref jmp) || 
     heuristic(board, x - 2, y - 1, ref jmp) || heuristic(board, x + 1, y + 2, ref jmp) || 
     heuristic(board, x + 1, y - 2, ref jmp) || heuristic(board, x - 1, y + 2, ref jmp) || 
     heuristic(board, x - 1, y - 2, ref jmp)) 
     return true; 
    board[x, y] = 0; 
    jmp--; 
    return false; 
} 

無限ループを取得し、それを呼んでいる:

var board = new int[8,8]; 
var x = 0; 
var y = 0; 
var jmp = 0; 
var result = heuristic(board, x, y, ref jmp); 

が、私は「としてjmp変数を持っている必要があります複数の試行を行い、また、取られた経路を示したいと考えています。 ありがとう! Wikipediaによると

+1

非常に長い時間を取るのではなく、無限ループであることを確認してください。 –

+0

@JohnBurger 8x8のボードです。 – Stefan

+0

@Stefanそれは質問に答えることはできません.. :)あなたは人々がコードを再現できるように、開始条件を提供してもらえますか?つまり、初期配列 'x'、' y'、 'jmp'はどうでしょうか? – Rob

答えて

2

26,534,728,821,064は[...]がありますが

ツアーナイト・ツアー用力まかせ探索は、すべての非現実的であるが、最小のボード。例えば、8x8ボード上には、約4x1の可能な移動シーケンスがあり、最新のコンピュータ(またはコンピュータのネットワーク)がこのような大きなセットで操作を実行する能力をはるかに上回ります。しかし、この数字のサイズは、問題の難しさを誤解させる印象を与えます。これは「人間の洞察力と工夫を利用して解決することができます。

+0

提案がありますか? – Stefan

+1

分裂と征服?ウォーンスドルフのルール?私がリンクしているWikipediaの記事をチェックしてください。これを行うには最善の方法で書かれた*博士号*があります... –

+0

Warnsdorfのルールは次のように考えられます:次の各可能な場所について、*そこから到達可能な場所の数を確認してください(言い換えれば、 。次に、*少なくとも*将来のオプションの数を選択します。他に何もなければ完全な深さ優先検索はできません... –