Хранение определенного числового шаблона в массиве - PullRequest
0 голосов
/ 18 октября 2019

Я работаю над вопросом и хочу сгенерировать определенный шаблон, который

1000
1100
1110
1111
0100
0110
0111
0010
0011
0001

, используя рекурсию и цикл for, но когда я пишу код, это дает мне исключение в потоке "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);
    }
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Имеет рекурсивную функцию, которая печатает столько строк, которые начинаются с сколь угодно большого числа нулей и скольких столбцов, и заставляет ее вызывать себя с одним дополнительным начальным нулем. Кроме того, следите за тем, какой ряд будет редактироваться следующим.

Если число ведущих нулей равно количеству столбцов, вернитесь, потому что все готово:

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);
    }
}
0 голосов
/ 18 октября 2019

Вы можете устранить ошибку, изменив метод solveNQUtil следующим образом. Это не гарантирует, что вы получите ответ, который ищете.

void solveNQUtil(int board[][], int col)
   {
      if (col == N)
         return;

      for (int i = 0; i < N; i++)
      {
         solveNQUtil(board, col + 1);
      }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...