Esempio n. 1
0
void countThaLoc(int** table, int size, int i, int j)
{
    
    
    
    int a, b;
    
    printf("[i:%d ,j:%d, usedBi:%d]\n",i,j, usedBi);
    //checkSafe를 통해 안전한지 확인하고 안전하지 않다면 그냥 리턴
    if(table[i][j]==1)
    {
        printf("SFSFSAFSAFSAFSADFSADF\n");
        checkDange=0;
        return;
    }
    if(checkSafe(table, size, i, j)==1)
    {
        printf("DANGER\n");
        return;
    }
    //
    
    table[i][j]=1;
    usedBi++;
    
    printTheTable(table, size);
    if(usedBi==numOfbi)
    {
        table[i][j]=0;
        count++;
        checkDange=1;
        printf("count : %d\n",count);
        usedBi--;
        return;
        
    }
    
    
    for(a=i; a<size; a++)
    {
        for(b=j; b<size; b++)
        {
            countThaLoc(table, size, a, b);
            if(checkDange==1)
            {
                table[a][b]=0;
                checkDange=1;
            }
        }
        j=0;
    }
    
    printf("'function finishied'\n");
    usedBi--;
    checkDange=1;
    
    
}
//Main solver function
bool fillSudoku()
{
    int row, col;
    //Check whether grid is filled; if not then return first unassigned value
    if(!findUnassigned(row, col))
    {
        return TRUE;
    }

    //Backtracking is used here.
    int num;
    for(num=1;num<SIZE+1;num++)
    {
            if(checkSafe(row,col,num))
            {
                cell[row][col]=num;
                if(fillSudoku()) return TRUE;
                cell[row][col]=0;
            }
    }
    return FALSE;
}
void MainWindow::on_solve_clicked()
{

    int i,j;
    int flag=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            QString str = entries[i][j]->text();
            int number=str.toInt();
            if(number==0&&str!="")
            {
                red->setColor(QPalette::Text,Qt::black);
                entries[i][j]->setPalette(*red);
                flag=1;
                entries[i][j]->setText("");
            }
            if(number<=9&&number>=1)
                cell[i][j]=number;
        }

    }

    if(flag==1) //any value is out of bound
    {

        QMessageBox *message = new QMessageBox();
        message->setWindowTitle("Error");
        message->setText("Out of range value.");
        message->setStandardButtons(QMessageBox::Ok);
        message->setDefaultButton(QMessageBox::Ok);
        message->setFocus();
        if(message->exec()==QMessageBox::Ok)
        {
            black->setColor(QPalette::Text,Qt::black);
        }

        black->setColor(QPalette::Text,Qt::black);
        flag=0;
    }

    else // no value is out of bound
    {

        int flag2=0; //  for invalid input

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(cell[i][j]!=0)
                {
                    if(checkSafe(i,j,cell[i][j]))
                        continue;
                    else
                    {
                        flag2=1;red->setColor(QPalette::Text,Qt::red);
                        entries[i][j]->setPalette(*red);
                    }
                }
            }
        }



        if(flag2==1) //yes there is invalid input
        {

            QMessageBox *message = new QMessageBox();
            message->setWindowTitle("Error");
            message->setText("Invalid input.");
            message->setStandardButtons(QMessageBox::Ok);
            message->setDefaultButton(QMessageBox::Ok);
            message->setFocus();
            if(message->exec()==QMessageBox::Ok)
            {}
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                cell[i][j]=0;
                black->setColor(QPalette::Text,Qt::black);
                entries[i][j]->setPalette(*black);
                }
            }
                flag=0;
        }
        else
        {

            fillSudoku();

            yellow->setColor(QPalette::Text,Qt::blue);
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    QString str = entries[i][j]->text();
                    int number=str.toInt();
                    if(str=="")
                    {
                        entries[i][j]->setPalette(*yellow);
                        entries[i][j]->setText(QString::number(cell[i][j]));
                    }
                 }
             }


        } //inner else

    } //else

} //function