Hallo seth,
da z ja eine zahl von 0 bis 8 ist, ist somit
is=Math.floor(z/3)*3 eine zahl von 0 bis 2
ie=is+3 ist folglich eine zahl von 3 bis 5
nein. 8/3 ist ~2.7, floor ergibt 2, mal 3 ergibt 6. Die obigen Operationen liefern also genau die Subquadrate.
hier mein Tester:
function check_fld(fld,z,s) {
var Zahl=fld[z][s];if(Zahl==" ")Zahl=20;
var i,is,ie,j,js,je;
for(j=0;j<s;j++) if(Zahl==fld[z][j]) return false;
for(j=s+1;j<sz2;j++) if(Zahl==fld[z][j]) return false;
for(i=0;i<z;i++) if(Zahl==fld[i][s]) return false;
for(i=z+1;i<sz2;i++) if(Zahl==fld[i][s]) return false;
is=Math.floor(z/sz)*sz;ie=is+sz;
js=Math.floor(s/sz)*sz;je=js+sz;
for(i=is;i<is+sz;i++) {
for(j=js;j<s;j++) if(Zahl==fld[i][j]) return false;
for(j=s+1;j<je;j++) if(Zahl==fld[i][j]) return false;
}
for(i=z+1;i<ie;i++) {
for(j=js;j<s;j++) if(Zahl==fld[i][j]) return false;
for(j=s+1;j<je;j++) if(Zahl==fld[i][j]) return false;
}
return true;
}
wobei fld die Matrix ist, z.B. 9*9, z und s sind die Zeilen bzw. Spaltennummer des zu testenden Wertes. sz2 ist die Größe der Matrix, z.B 9. Die Sache ist etwas "aufgebläht, da ich die Schleifen vor/über und nach/unter dem Prüffeld laufen lasse und im Block die schon geprüften Zeilen und Spaltenwerte auslasse.
Der Tester ist vieleicht nicht ganz so elegant, aber ich muss, außer bei den Schleifenzählern, nur vergleichen und nicht rechnen. Da diese Funktion beim Berechnen eines Sudokus "fast unendlich" oft aufgerufen wird, ist Schnelligkeit hier besonders wichtig.
Gruß, Jürgen