160 lines
4.9 KiB
Text
160 lines
4.9 KiB
Text
|
public class thRisolutore extends Thread{
|
||
|
private Cella[][] celleSoluzione;
|
||
|
private boolean esecuzione;
|
||
|
private boolean arretra;
|
||
|
|
||
|
public thRisolutore(Cella[][] celleInput) {
|
||
|
celleSoluzione = new Cella[9][9];
|
||
|
|
||
|
//creao un secondo array bidim celle dove andrò a salvare i numeri della soluzione
|
||
|
//ora riempo l array soluzioni con i numeri gia inseriti e li metto fissi
|
||
|
for(int r = 0; r < cellePerLato; r++){
|
||
|
for(int c = 0; c < cellePerLato; c++){
|
||
|
celleSoluzione[c][r] = new Cella(c, r, lato/cellePerLato);
|
||
|
|
||
|
celleSoluzione[c][r].setN(celleInput[c][r].getN());
|
||
|
|
||
|
if(celleSoluzione[c][r].getN() > 0){
|
||
|
celleSoluzione[c][r].setFissa(true);
|
||
|
//println("Riga" + r + "Colonna" + c + "è fissata: " + celleSoluzione[c][r].getN());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//faccio subito partire il thread
|
||
|
this.inizia();
|
||
|
}
|
||
|
|
||
|
public void inizia(){
|
||
|
this.esecuzione = true;
|
||
|
this.start();
|
||
|
}
|
||
|
|
||
|
boolean isEsecuzione() {
|
||
|
return this.esecuzione;
|
||
|
}
|
||
|
|
||
|
private boolean inserisciVal(int r, int c, int n){
|
||
|
//println("provo con " + n);
|
||
|
//Controllo in tutta la COLONNA se è già presente il numero che si vuole inserire
|
||
|
for(int iC = 0; iC < 9; iC++){
|
||
|
//println("c: " + iC);
|
||
|
if(n != 0 && n == celleSoluzione[iC][r].getN()){
|
||
|
//println(n + " gia presente in c: " + iC);
|
||
|
|
||
|
return true;
|
||
|
}//else println(n + " non presente in c: " + iC);
|
||
|
}
|
||
|
|
||
|
//Controllo in tutta la COLONNA se è già presente il numero che si vuole inserire
|
||
|
for(int iR = 0; iR < 9; iR++){
|
||
|
//println("r: " + iR);
|
||
|
if(n != 0 && n == celleSoluzione[c][iR].getN()){
|
||
|
//println(n + " gia presente in c: " + iR);
|
||
|
|
||
|
return true;
|
||
|
}//else println(n + " non presente in c: " + iR);
|
||
|
}
|
||
|
|
||
|
//Controllo che nella regione non è già presente lo stesso numero
|
||
|
//trovo la regione della cella
|
||
|
int cR = floor(c/3);
|
||
|
int rR = floor(r/3);
|
||
|
|
||
|
for(int iR = 0; iR <3; iR++){
|
||
|
for(int iC = 0; iC <3; iC++){
|
||
|
if(n != 0 && n == celleSoluzione[cR*3 + iC][rR*3 + iR].getN()){
|
||
|
//controllo che cella modificata e controllata siano diverse
|
||
|
if(c != (cR*3 + iC) && r != (rR*3 + iR)){
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//try {
|
||
|
// Thread.sleep(500);
|
||
|
//}catch(InterruptedException e) {
|
||
|
// esecuzione = false;
|
||
|
//}
|
||
|
|
||
|
celleSoluzione[c][r].setN(n);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public void run()
|
||
|
{
|
||
|
while(esecuzione){
|
||
|
celle = celleSoluzione;
|
||
|
boolean errore; //numero inserito non valido
|
||
|
int prove;
|
||
|
errore = true;
|
||
|
try {
|
||
|
celle = celleSoluzione;
|
||
|
for(int r = 0; r < 9; r++){
|
||
|
for(int c = 0; c < 9; c++){
|
||
|
|
||
|
//println(r + " " + c);
|
||
|
//parto dalla prima cella in alto a sx, controlo se è non è fissa altrimenti la salto
|
||
|
if(!celleSoluzione[c][r].isFissa()){
|
||
|
arretra = false;
|
||
|
//println("cella non fissa: " + c);
|
||
|
if(celleSoluzione[c][r].getN() < 9){
|
||
|
//println("n < 9: ");
|
||
|
errore = true;
|
||
|
prove = 1;
|
||
|
while(errore){
|
||
|
//quando arrivo a dover inserire 10 nella esco dal while e torno indietro
|
||
|
if(celleSoluzione[c][r].getN() + prove < 10){
|
||
|
//println("controllo fattibilità");
|
||
|
errore = inserisciVal(r, c, celleSoluzione[c][r].getN() + prove);
|
||
|
prove ++;
|
||
|
}else{
|
||
|
//se arrivo a provare il 9 e non va allora arretro di una cella
|
||
|
arretra = true;
|
||
|
errore = false;
|
||
|
celleSoluzione[c][r].setN(0);
|
||
|
if(c!=0){
|
||
|
c -= 2;
|
||
|
}else{
|
||
|
r --;
|
||
|
c = 7;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
//se la cella in cui ho indietreggiato contiene nove allora arretro ancroa
|
||
|
errore = false;
|
||
|
arretra = true;
|
||
|
celleSoluzione[c][r].setN(0);
|
||
|
if(c!=0){
|
||
|
c -= 2;
|
||
|
}else{
|
||
|
r --;
|
||
|
c = 7;
|
||
|
}
|
||
|
}
|
||
|
}else if (arretra){
|
||
|
//se ho appena arretrato e la cella è ancora fissa aretro ancora
|
||
|
if(c!=0){
|
||
|
c -= 2;
|
||
|
}else{
|
||
|
r --;
|
||
|
c = 7;
|
||
|
}
|
||
|
}
|
||
|
//println("nuova cella colonna");
|
||
|
Thread.sleep(0);
|
||
|
}
|
||
|
|
||
|
//println("nuova cella riga");
|
||
|
}
|
||
|
println("è stato facile");
|
||
|
esecuzione = false;
|
||
|
|
||
|
}catch(InterruptedException e) {
|
||
|
esecuzione = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|