JAVASCRIPT: Licznik rozwiązań sudoku.

0

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;
}
0

Ten kod jest zupełnie nieczytelny - nie wiadomo co się w nim dzieje, a zmienne nazwane ss czy elem wcale nie pomagają.

1 użytkowników online, w tym zalogowanych: 0, gości: 1