私は、(N、ここでは入力として与えられる)NxNの行列を作成するようにする必要がある問題に取り組んでい様数独は、すべてのエントリは範囲[1、N]とに記載されていませんエントリは特定の行または列で2回繰り返されます。対角線には制約はありません。作成 -
また、すべての実行でグリッドの出力が確実に出力されるように、乱数ジェネレータを使用する必要があります。
また、私はこれを解決するためにバックトラッキングを使用するヒントを与えられました。どの要素が任意の行/列回繰り返されていない場合
func(i,j):
grid[i][j] = 1 + rand()%N
if(check(grid)==true)
j++
if j == N
j = 0
i++
if i == N
return
else
//resetting the grid entry
grid[i][j] = -1;
//make a recursive call to func(i,j) again
func(i,j)
チェック(グリッド)を次のように私はアルゴリズムを考えた
は真を返します。
どこかで無限ループに詰まっている可能性があり、これでバックトラッキングを使用していない可能性があるので、間違っていることがわかります 問題のバックトラックを使用する方法について教えてもらえますか?
誰かが何らかのコードを提供できるといいですね。ありがとう。ある場合
complete(S):
If S is completely filled in, return true
find the index [i,j] where there's the fewest immediate choices.
for c in each choice for S[i,j] { // iterated over in a random order
S[i][j] = c
if complete(S) {
return true
}
}
S[i][j] = blank
return false
}
この手順では、ブールを返す、ランダムに有効なソリューションを持つ配列Sを完了: