Я сделал это для проблемы N королев в Java.Итак, если вы пытаетесь напечатать другие фрагменты, кроме королевы, то соответствующим образом настройте свой код.Если вы не знакомы с этой проблемой, то задача состоит в том, чтобы разместить N ферзей на N x N шахматной доске таким образом, чтобы никакие две королевы не проверяли друг друга.Я знаю, что это спустя годы после того, как вы опубликовали вопрос, но я решил поместить здесь фрагменты кода, чтобы кто-то мог использовать его в будущем.
В любом случае, первый шаг - создать наш массив N x N, представляющийпробелы на шахматной доске и стоимость фигур, находящихся в настоящее время на доске.Стоит отметить, что, поскольку это Java, наша доска основана на 0 (так как в каждой строке строки нумеруются от 0 до 7, а не от 1 до 8):
public static final int N = 8;
public static char [][] board = new char[N][N];
//initialize every space to a space
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
board[i][j] = ' ';
}
}
Смотрите, мы инициализируем каждую точку впространство, так что мы можем затем перебрать вектор, который я имею для местоположений королев, и изменить только те места, где должна быть размещена королева.
Вот пример вектора решения: [1 6 2 5 7 4 0 3]
.Предположим, этот вектор представлен int[] vector = new int[N]
. Количество элементов равно количеству строк на доске.Его индекс в векторе соответствует строке, а само значение соответствует номеру столбца, в котором ферзь находится в этой строке.Таким образом, мы просто перебираем их и обновляем массив досок соответствующим образом:
for(int j = 0; j < N; j++){
board[j][vector[j]] = 'Q';
}
Если ваша задача связана с реальной игрой в шахматы, вам нужно будет перебирать каждую фигуру и обновлять расположение ее доски аналогичным образом.
Прежде чем я объясню, как сделать эту доску, позвольте мне показать вам доску, которая соответствует вектору, упомянутому ранее.Кроме того, обратите внимание, что никакие королевы не проверяют!Я решил эту проблему, используя генетические алгоритмы.
+---+---+---+---+---+---+---+---+
| | Q | | | | | | |
+---+---+---+---+---+---+---+---+
| | | | | | | Q | |
+---+---+---+---+---+---+---+---+
| | | Q | | | | | |
+---+---+---+---+---+---+---+---+
| | | | | | Q | | |
+---+---+---+---+---+---+---+---+
| | | | | | | | Q |
+---+---+---+---+---+---+---+---+
| | | | | Q | | | |
+---+---+---+---+---+---+---+---+
| Q | | | | | | | |
+---+---+---+---+---+---+---+---+
| | | | Q | | | | |
+---+---+---+---+---+---+---+---+
Наш следующий шаг - создать границы между строками (и сверху, и снизу).Я рассматриваю каждую строку как форматированную строку.Поскольку у нас есть строки пробелов и границы строк, наш массив строк имеет размер 2 * N + 1.
String[] row = new String[2*N + 1];
String border = "";
//must be the length of board
for(int i = 0; i < N; i++){
border += "+---";
}
border += "+";
//every other row is a border row
for(int i = 0; i < 2*N +1; i+=2){
row[i] = border;
}
//must include the bottom
row[2*N] = border;
Далее мы создаем строки для самих пространств доски.Так как они уже есть на нашей доске [] [], нам нужно только отформатировать.
for(int i = 0; i < N; i++){
//left bar
String spaces = "| ";
//place enclosing right bar and spaces so next char goes in middle of next space
for(int j = 0; j < N; j++){
spaces += board[i][j];
spaces += " | ";
}
//add the spaces string to the rows at the odd indices
row[2*k +1 ] = spaces;
}
Осталось только напечатать эту доску.
for(int i = 0; i < 2*N +1; i++){
System.out.println(row[i]);
}
Надеюсь, это кому-нибудь поможет!