Staram się zrobić generator sudoku. Pawie skończyłem ale musze usunąć pare numerków żeby nie było za łatao :p
Dlatego po kazdym usunięciu numerka chce sprawdzić cczy sudoku nadal ma tylko 1 rozwiązanie.
Ale nie moge stworzyć odpowiedniego skryptu który by znalazł WSZYSKIE możliwe rozwiązania.
Więc jak to zrobić żeby znalazł sobie wszystkie mozliwe kombinacje?
na razie tak to wygląda. Nie mam zbyt wiele komentarzy więc jeśli coś jest nie jasne to prosze pytać.
var deletedE = 0;
var element; // numbers
var oneS = false; // statment of number of solutions
var elem = [];
function prepare(testArea, amount)
{
var toDelete = 81-amount; // how many elements is to delete
element = testArea;
for(var i = 0; i < toDelete; i++)
{
var y;
var x;
deletedE += 1;
do
{
do
{
y = Math.floor((Math.random() * 9) + 0);
x = Math.floor((Math.random() * 9) + 0);
}
while(element[y][x] == '')
element[y][x] = '';
for(var s = 0; s < 9; s++)
{
elem[s] = []
for(var ss = 0; ss < 9; ss++)
{
elem[s][ss] = element[s][ss];
}
}
//console.log("element(1):",y,x,element[y][x]);
oneS = solve();
if (!oneS)
{
element[y][x] = testArea[y][x];
}
else
{
for(var s = 0; s < 9; s++)
{
for(var ss = 0; ss < 9; ss++)
{
element[s][ss] = elem[s][ss];
}
}
}
console.log("prepare:element",y,",",x,"oneS:",oneS,"deleted:",i);
}
while(oneS == false)
//console.log(element);
}
return element;
}
function solve()
{
var ok = true; //
var holder; // current number
var solution = 1; // how many solutions
var num = 1; // current number
var solTables = []; // array of all solutions
var lastPos= []; // last number postions
var backTrack = []; // blocked varibles
var first = null; // first empty element
for(var le = 0; le < deletedE; le++)
{
for(var i = 0; i < 9; i++)
{
backTrack[i] = [];
for(var x = 0; x < 9; x++)
{
backTrack[i][x] = [];
if (elem[i][x] == '')
{
if (first == null)
{
first = [i,x]; // first empty element
}
fill = function()
{
//console.log("Holder:",num);
ok = true; // restart state
holder = num;
ok = scanBox(i, x, holder); // scan for 3x3
for(var s = 0; s < 9; s++) // scan for columns
{
if (elem[s][x] == holder)
{
ok = false;
}
}
for(var s = 0; s < 9; s++) // scan for rows
{
if (elem[i][s] == holder)
{
ok = false;
}
}
for(var t = 0; t < backTrack[i][x].length; t++) // scan for used
{
if (backTrack[i][x][t] == holder) ok = false;
}
//console.log("Postition:",i,",",x,"ok:",ok,"num:",num);
if (!ok)
{
if (num == 9) // if can't place last number
{
if (first[0] == i && first[1] == x) // if that was first empty element
{
num = backTrack[i][x][0];
backTrack[i][x] = [];
}
else
{
backTrack[i][x] = [];
var last_i = lastPos[lastPos.length-1][0];
var last_x = lastPos[lastPos.length-1][1];
elem[last_i][last_x] = "";
i = last_i;
x = last_x;
lastPos.pop();
num = 1;
}
}
else
{
num += 1;
}
//console.log("LE:",le,"newNum:",num,"new_i:",i,"new_x:",x,"backTrack:",backTrack);
fill(); // repeat
}
}
fill();
elem[i][x] = holder; // put number in table
lastPos.push([i,x]); // add last position
backTrack[i][x].push(holder);
//console.log("le:",le,"pos:",i,x,"war:",holder);
num = 1;
}
}
}
//console.log("element(2):",element[yy][xx]);
solTables.push(elem);
first = null;
for(var s = 0; s < 9; s++)
{
elem[s] = []
for(var ss = 0; ss < 9; ss++)
{
elem[s][ss] = element[s][ss];
}
}
var equal = true;
if (solTables.length > 1)
{
for(var s = 0; s < 9; s++)
{
for(var ss = 0; ss < 9; ss++)
{
if(solTables[le][s][ss] != solTables[le-1][s][ss])
{
equal = false;
break;
}
//console.log(solTables[le][s][ss],solTables[le-1][s][ss],equal);
}
if (!equal) break;
}
}
if (solTables.length > 1 && !equal) solution += 1;
if (solution > 1) break;
}
if (solution < 2) return true;
else return false;
}