Search code examples
javaalgorithmbacktrackingarray-algorithms

Storing a specific number pattern in an array


I am working on a question and want to generate a specific pattern which is

1000
1100
1110
1111
0100
0110
0111
0010
0011
0001

using recursion and a for loop but when I write the code it gives me an Exception in thread "main" java.lang.StackOverflowError


public class NQueenProblem {
    final static int N = 8;

    void printSolution(int board[][])
    {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++)
                System.out.print(" "+board[i][j]+" ");
            System.out.println();
        }
    }
    void solveNQUtil(int board[][], int col)
    {
        for (int i = 0; i < N; i++) {
            solveNQUtil(board, col + 1);
        }
    }
    public static void main(String[] args) {

        NQueenProblem Queen = new NQueenProblem();
        int board[][] = new int[N][N];
        Queen.solveNQUtil(board, 0);
    }
}


Solution

  • Have a recursive function that prints out as many lines that start with however many zeros and however many columns, and have it call itself with one additional leading zero. Also, keep track of what row is to be edited next.

    If the number of leading zeros equals the number of columns, return because you're done:

    public class NQueenProblem {
        static void printSolution(int board[][])
        {
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[i].length; j++)
                    System.out.print(" "+board[i][j]+" ");
                System.out.println();
            }
        }    
        static void solveNQUtil(int leadingZeros, int startingRow, int board[][])
        {
            int columns = board[0].length;
    
            if (leadingZeros == columns) return;
    
            for (int ones = 1; leadingZeros+ones <= columns ; ones++) 
            {
                int curRow = startingRow + ones - 1;
    
                for (int i=0 ; i<ones ; i++) board[curRow][i+leadingZeros] = 1;
            }
    
            solveNQUtil(leadingZeros + 1, startingRow + columns - leadingZeros, board);
        }
    
        public static void main(String[] args) 
        {
            int totalColumns = 4;
            int rows = (int)((totalColumns+1)*totalColumns*0.5); //
    
            int board[][] = new int[rows][totalColumns];
    
            solveNQUtil(0, 0, board);
            printSolution(board);
        }
    }