/*** * Classe que implementa o Sudoku * @author Balhau * @classDescription O objecto Sudoku contém funções para geração de sudokus e respectivas soluções * @requires Este ficheiro necessita do ficheiro js.js como requisito devido a funções utilitárias */ var Sudoku=function(){ var dx=Sudoku.DIMX; var dy=Sudoku.DIMY; this._mat=[]; this.clear(); }; Sudoku.getPosXY=function(pos){ var x=pos%9; var y=Math.floor(pos/9); return {"x":x,"y":y}; }; Sudoku.toPos=function(x,y){ var dx=Sudoku.DIMX; var dy=Sudoku.DIMY; if(x>=dx) x=dx-1; if(y>=dy) y=dy-1; return y*9+x; }; /** * Verifica se a coluna contem valores todos diferentes * @param pos Posição no vector * @param val Valor a colocar no vector * @return Boolean */ Sudoku.prototype.checkColum=function(pos,val){ var dx=Sudoku.DIMX; var dy=Sudoku.DIMY; var p=Sudoku.getPosXY(pos); for(var i=0;i=3 && p.x<6)pi=1;else pi=2; if(p.y<3)pj=0;else if(p.y>=3 && p.y<6)pj=1;else pj=2; var ci=0; var pii=pi*3; var li=pj*9*3; for(var i=0;i<9;i++){ if(i%3==0 && i!=0){ ci=0; li+=9; } //var p=Sudoku.getPosXY(li+ci+pii); //console.log("PosA: "+p.x+","+p.y); if(this._mat[li+ci+pii]==val) return false; ci++; } return true; }; /** * Método que reinicia o vector com os valores do sudoku * @return */ Sudoku.prototype.clear=function(){ var dx=Sudoku.DIMX; var dy=Sudoku.DIMY; for(var i=0;imaxit){ pos=Math.max(0,i-Sudoku.BACK_TRACK_STEP); this.clearLastValues(i, pos); //backtrack i=pos; //retorna atrás nas iteracções it=0; //inicia o contador itt++; } if(itt>maxitt){ i=maxitt; } } if(i==maxitt) return false; return true; }; /** * Método que devolve os blocos do sudoku sob a forma de HTML * @param x Ponto x do bloco * @param y Ponto y do bloco * @return String com o código em HTML do bloco */ Sudoku.prototype.getHTMLBlock=function(x,y){ var pi,pj;//variaveis que identificam o bloco if(x<3)pi=0;else if(x>=3 && x<6)pi=1;else pi=2; if(y<3)pj=0;else if(y>=3 && y<6)pj=1;else pj=2; var ci=0; var pii=pi*3; var li=pj*9*3; var ncl=((x+y)%2==0)?"par":"impar"; var str="\n\t"; for(var i=0;i<9;i++){ if(i%3==0 && i!=0){ ci=0; li+=9; str+="\n\t\n\t"; } str+="\n\t\t"; ci++; } str+="\n\t\n
"+this._mat[li+ci+pii]+"
"; return str; }; /** * Método que devolve uma instância do sudoku em função do seu nível de dificuldade * @param level * @return */ Sudoku.prototype.getSudoku=function(level){ if(BLauLib.isUndefined(level)) level=Sudoku.EASY; var comp=this._mat.length; var pb=0.5-level*0.12; var ninst=new Sudoku(); var mclone=this._mat.clone(); for(var i=0;i"; } str+=""; } str+=""; return str; }; /** * Método que devolve uma descrição do sudoku em forma de string * @return String */ Sudoku.prototype.toString=function(){ var st=""; var cmp=this._mat.length; var pl=1; for(var i=0;i0?this._mat[i]:" "; if((i+1)%9==0){ pl++; st+="|\n"; } if(pl%4==0){ for(var j=0;j<9;j++){ st+="___"; } st+="\n"; pl=1; } } return st; };