Solve the Sudoku

PROBLEM :

Given an incomplete Sudoku configuration in terms of a 9x9  2-D square matrix (mat[][]) the task to print a solution of the Sudoku. For simplicity you may assume that there will be only one unique solution.

Example



For the above configuration the solution is
3 1 6 5 7 8 4 9 2
5 2 9 1 3 4 7 6 8
4 8 7 6 2 9 5 3 1
2 6 3 4 1 5 9 8 7
9 7 4 8 6 3 1 2 5
8 5 1 7 9 2 6 4 3
1 3 8 9 4 7 2 5 6
6 9 2 3 5 1 8 7 4
7 4 5 2 8 6 3 1 9


Input:
The first line of input contains an integer T denoting the no of test cases. Then T test cases follow. Each test case contains 9*9 space separated values of the matrix mat[][] representing an incomplete Sudoku state where a 0 represents empty block.

Output:
For each test case in a new line print the space separated values of the solution of the the sudoku.

Constraints:
1<=T<=10
0<=mat[]<=9

Example:
Input:
1
3 0 6 5 0 8 4 0 0 5 2 0 0 0 0 0 0 0 0 8 7 0 0 0 0 3 1 0 0 3 0 1 0 0 8 0 9 0 0 8 6 3 0 0 5 0 5 0 0 9 0 6 0 0 1 3 0 0 0 0 2 5 0 0 0 0 0 0 0 0 7 4 0 0 5 2 0 6 3 0 0

Output:
3 1 6 5 7 8 4 9 2 5 2 9 1 3 4 7 6 8 4 8 7 6 2 9 5 3 1 2 6 3 4 1 5 9 8 7 9 7 4 8 6 3 1 2 5 8 5 1 7 9 2 6 4 3 1 3 8 9 4 7 2 5 6 6 9 2 3 5 1 8 7 4 7 4 5 2 8 6 3 1 9
       
--------------------------------------------------------------------------------
SIMPLE c++ IMPLEMENTATION :
--------------------------------------------------------------------------------

#include<iostream>
using namespace std;
#define N 9

bool FindSpace(int chess[N][N],int *row,int *col)
{
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
            if(!chess[i][j])
            {
                (*row)=i ;
                (*col)=j ;
                return false ;
            }
    return true ;
}

bool IsSafe(int chess[N][N],int row,int col,int no)
{
    for(int i=0;i<N;i++)
        if(chess[row][i]==no)
            return false ;
           
    for(int i=0;i<N;i++)
        if(chess[i][col]==no)
            return false ;
           
    row=row-(row%3) ;
    col=col-(col%3) ;
   
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            if(chess[i+row][j+col]==no)
                return false ;
               
    return true ;
}

bool SolveSudoku(int chess[N][N])
{
    int row,col ;
   
    if(FindSpace(chess,&row,&col))
        return true ;
       
    for(int i=1;i<=9;i++)
    {
        if(IsSafe(chess,row,col,i))
        {
            chess[row][col]=i ;
           
            if(SolveSudoku(chess))
                return true ;
               
            chess[row][col]=0 ;
        }
    }
   
    return false ;
}

int main()
{
int t ;
cin>>t ;
while(t--)
{
   int chess[N][N] ;
 
   for(int i=0;i<N;i++)
       for(int j=0;j<N;j++)
           cin>>chess[i][j] ;
         
        if(SolveSudoku(chess))
        {
            for(int i=0;i<N;i++)
           for(int j=0;j<N;j++)
               cout<<chess[i][j]<<" " ;
        }
        else
            cout<<"No solution exists" ;
        cout<<endl ;
}
return 0;
}

--------------------------------------------------------------------------------

Comments

Popular posts from this blog

Count ways to N'th Stair(Order does not matter)

Replace all ‘0’ with ‘5’ in an input Integer

Chocolate Distribution Problem

Remove characters from the first string which are present in the second string

Primality Test ( CodeChef Problem code: PRB01 )