const int MX = 100 ;
int queen[ MX ] ; // queen[i] for ith row queen
int column[ MX ] , diagonal1[ MX + MX ] , diagonal2[ MX + MX ] ; // always double from column 
int total ; // It will determine the total number of solution 

// call with nqueen( 1 , 8 ) for 8 queen problem 
// make sure column [ MX ] , diagonal1[ MX + MX ] , diagonal2[ MX + MX ] are all initially 0 

int nqueen( int now , int n )
{
    if( now == n + 1 ) // complete 
    {
        total += 1 ; // count total unique solution 
        printf(" ( row , column ) " );
        for ( int i = 1 ; i <= n ; i++ )
        {
            printf("(%d , %d) " , i , queen[i] );
            
        }
        printf("\n");
        return ;
    }
    for ( int i = 1 ; i <= n ; i++ )
    {
        if( column[i] || diagonal1[ i + now ] || diagonal2[ n + i - now ] ) continue ;
        // As i - now can be negative thats why we are adding n 
        queen[ now ] = i ; // position of column 
        column[i] = diagonal1 [ i + now ] = diagonal2 [ n + now - i ] = 1 ;
        nqueen( now + 1 , n );
        column[i] = diagonal1 [ i + now ] = diagonal2 [ n + now - i ] = 0 ;
        
    }
}