var max_colonne = 9; // numero massimo di colonne
var max_righe = 9; // numero massimo di righe
schema=new Array( max_righe )
for (i=0; i<max_righe; i++ )
{
    schema[i] = new Array( max_colonne );
    for (j = 0;j < max_colonne; j++ )
        schema[i][j] = 0;
}

//----------------------------------------------------------
function stampaSchema()
{
    var i;
	
	for( i=0; i<9; i++)
	   for( j=0; j<9; j++)
		  document.sudokuTable.elements[i*9+j +82].value = schema[i][j];
}

//----------------------------------------------------------
function fillCifreOccupate( riga, col, ar )
{
    var prima_riga;
    var prima_col;
    var i;
    var j;

    for( i = 0; i < 9; i++ )
        ar[ i ] = 0;
    for( i = 0; i < 9; i++ )
    {
        if( schema[ riga ][ i ] != 0 )
            ar[ schema[ riga ][ i ]-1 ] = 1;
        if( schema[ i ][ col ] != 0 )
            ar[ schema[ i ][ col ]-1 ] = 1;
    }

    if( riga > 5 )
        prima_riga = 6;
    else
    {
        if( riga > 2 )
            prima_riga = 3;
        else
            prima_riga = 0;
    }
    if( col > 5 )
        prima_col = 6;
    else
    {
        if( col > 2 )
            prima_col = 3;
        else
            prima_col = 0;
    }

    for( i = prima_riga; i < ( prima_riga + 3 ); i++ ) // cicla sulle 3 righe
        for( j = prima_col; j < ( prima_col + 3 ); j++ ) // cicla sulle 3 colonne
            if( schema[ i ][ j ] != 0 )
                ar[ schema[ i ][ j ]-1 ] = 1;
}

//----------------------------------------------------------
function risolvi( st_riga, st_col )
{
    var riga;
    var col;
    var cifra;
    var i;

    var cifre_occupate = new Array( 9 );
    for( i=0; i<9; i++ )
        cifre_occupate[i] = 0;

    for( riga = st_riga; riga < max_righe; riga++ )
    {
        for( col = st_col; col < max_colonne; col++ )
        {
            if( schema[ riga ][ col ] == 0 )
            {
                fillCifreOccupate( riga, col, cifre_occupate );
                for( cifra = 1; cifra <= 9; cifra ++ )
                {
                    if( cifre_occupate[ cifra-1 ] == 0 )
                    {
                        schema[ riga ][ col ] = cifra;
                        if( risolvi( riga, col ) )
                            return 1;
                        schema[ riga ][ col ] = 0;
                    }
                }

                return 0;
            }
        }
        st_col = 0;
    }

    return 1;
}

//----------------------------------------------------------
function CheckVal( riga, col )
{
    var prima_riga, prima_col;
    var i, j;
    var val = schema[ riga ][ col ];

    if ( val == 0 )
        return 1;

    //------------------------------------------------------------
    // test sulla riga
    //------------------------------------------------------------
    for ( i = 0; i < max_colonne; i++ ) {
        if ( ( i != col ) && ( schema[ riga ][ i ] == val ) )
            return 0;
    }

    //------------------------------------------------------------
    // test sulla colonna
    //------------------------------------------------------------
    for ( i = 0; i < max_righe; i++ ) {
        if ( ( i != riga ) && ( schema[ i ][ col ] == val ) )
            return 0;
    }

    //------------------------------------------------------------
    // test sul blocco
    //------------------------------------------------------------
    if ( riga > 5 ) prima_riga = 6;
    else
    {
        if ( riga > 2 )
            prima_riga = 3;
        else
            prima_riga = 0;
    }

    if ( col > 5 ) prima_col = 6;
    else
    {
        if ( col > 2 )
            prima_col = 3;
        else
            prima_col = 0;
    }

    for ( i = prima_riga; i < ( prima_riga + 3 ); i++ )
    {
        for ( j = prima_col; j < ( prima_col + 3 ); j++ )
        {
            if ( ( i != riga ) && ( j != col ) &&
                 ( schema[ i ][ j ] == val ) )
                return 0;
        }
    }
    return 1;
}

//----------------------------------------------------------
function CheckSchema()
{
    var i,j;

    for( i=0; i<9; i++)
    {
        for( j=0; j<9; j++)
        {
            if( CheckVal( i, j ) != 1 )
                return 0;
        }
    }
    return 1;
}



function getval( field )
{
    val = parseInt( field );
    if (isNaN(val)) {
        return 0;
    } else {
        return val;
    }
}

function risolvibtn( f )
{
	var i;
	
	for( i=0; i<9; i++)
		for( j=0; j<9; j++)
		  schema[i][j] = getval( document.sudokuTable.elements[i*9+j].value );

    if( CheckSchema() == 0 )
    {
        alert( "Schema impossibile!" );
    }
    else
    {
        if( risolvi(0,0) )
        {
            alert( "Risolto!" );
            stampaSchema();
        }
        else
        {
            alert.write( "non risolto!" );
        }
    }
}

