Anda di halaman 1dari 3

Algoritmo de bsqueda de zudoku

//n: nivel de dificultad (de 1 a 9);


function generar(n) {
if (!nini) {
z=" -aqu va la cadena unicode, debereis bajar el FLA pues solo
copiando NO funcionar- ";
nini = true;
}
f = Math.floor;
r = Math.random;
B = 4096;
d1 = [];
d2 = [];
m = [];
s0 = "";
kr = [];
kf = [];
ks = [];
kt = [];
rd = r()<.5;
al = z.length;
rg = f(al*r());
for (var j = 0; j<10; j += 9) {
for (var h = 0; h<3; h++) {
if (!h) {
m2(j);
}
m1(m, j+3*h, 3*h+3+j);
}
}
for (var j = 0; j<3; j++) {
m[j] = m[9+j*3].concat(m[10+j*3].concat(m[11+j*3]));
}
m1(m, 0, 3);
m[3] = m[0].concat(m[1].concat(m[2]));
for (var j = 0; j<9; j++) {
d1[j] = j+1;
for (var h = 0; h<3; h++) {
v = j*3+h;
w = 9*(v%9)+f(v/9);
m[0][v] = m[3][w];
m[1][v] = m[3][w+3];
m[2][v] = m[3][w+6];
}

}
m1(m, 0, 3);
m1(d1, 0, 9);
sl = m[0].concat(m[1].concat(m[2]));
for (var v = 0; v<al; v++) {
t = (rg+v)%al;
k0 = z.charCodeAt(t);
nv = (15 & k0)-n;
if (k0<=B && nv>=0 && nv<6) {
cn = 0;
d = k0 >> 8;
s = (240 & k0) >> 4;
for (var h = 1+t; h<=s+t; h++) {
k1 = z.charCodeAt(h)-B;
kf[0] = 15 & k1;
kf[1] = (240 & k1) >> 4;
kf[2] = (3840 & k1) >> 8;
kf[3] = k1 >> 12;
for (var j = 0; j<4; j += 2) {
cn += kf[j];
if (kf[j+1]) {
ks.push(cn, kf[j+1]);
cn++;
}
}
}
q = f(r()*2)+nv*2+f(r()*(nv+1));
for (var h = s+1+t; h<=s+d+t; h++) {
kt[h-s-1-t] =
z.charCodeAt(h)-B;
}
for (var h = 0; h<kt.length-1; h += 3) {
m1(kt, 2, h+3);
}
for (var h = 0; h<q; h++) {
k3 = f(kt[h]/10);
ks.push(k3, kt[h]-k3*10);
}
lg = ks.length;
break;
}
}
for (var h = 0; h<lg-1; h += 2) {
kr[sl[ks[h]]] = d1[ks[h+1]-1];
}
for (var j = 0; j<81; j++) {
s0 += kr[j] ? kr[j] : ".";
}
return s0;

function m1(b, a, c) {
for (var i = c-a; i>1; i--) {
e = a+f(i*r());
o = b[i-1+a];
b[i-1+a] = b[e];
b[e] = o;
}
return (b);
}
function m2(a) {
for (var j = 0; j<9; j++) {
m[j+a] = [];
for (var h = 0; h<9; h++) {
m[j+a][h] = a == 0 ? rd ? j*9+h : h*9+j : m[h][j];
}
}

}
//Ejemplo: trace(generar(6)); //Manda la panel de salida el sudoku
generado con dificultad 6(media-superior) y solucin nica. //Tipo
de salida:
8..56...14..9...8......83.2.2...1....8..2.7....3.....46.....2..3.524
....2.9.5..6. //Los puntos son casillas vacias.(cadena de las 81
casillas)

Anda mungkin juga menyukai