Обход шахматной доски конем (ошибка в коде) - C (СИ)
Формулировка задачи:
Язык Си. Поиск проблемы и её решение.
Какая проблема в этом коде что не показывает норм результат??
Помогите плиз или наийти ошибку или сделать так чтоб показывал правильно.
Задача знакома многим, обход шах.доски конем. Помогите, очень надо. Я в этом языке пока не очень понимаю...
Помогите решить эту проблему!!
#include <stdio.h> #define N 5 int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}; int dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2}; int c[N*N][2]; int count = 0; void back(int pas) { int i, j, continuare; if (pas == N*N) { for (i=0; i<pas; i++) printf("(%d,%d) ", c[i][0], c[i][1]); printf("\n"); count++; } else { for (i=0; i<8; i++) { c[pas][0] = c[pas-1][0] + dy[i]; c[pas][1] = c[pas-1][1] + dx[i]; if ((c[pas][0]>=0) && (c[pas][0]<N) && (c[pas][1]>=0) && (c[pas][1]<N)) { continuare = 1; for (j=0; continuare && (j<pas); j++) { if ((c[j][0] == c[pas][0]) && (c[j][1] == c[pas][1])) continuare = 0; } if (continuare) back(pas+1); } } } } int main(void) { int i,j; for (i=0; i<N; i++) for (j=0; j<N; j++) { c[0][0] = i; c[0][1] = j; back(1); } printf("%d solutii\n", count); return 0; }
Решение задачи: «Обход шахматной доски конем (ошибка в коде)»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define SIZE 8 int main () { int board [SIZE][SIZE] = {0}; //массивы восьми возможных ходов int horizontal [SIZE] = {2, 1, -1, -2, -2, -1, 1, 2}; int vertical [SIZE] = {-1, -2, -2, -1, 1, 2, 2, 1}; // ходы обратно int back_horizontal [SIZE] = {-2, -1, 1, 2, 2, 1, -1, -2}; int back_vertical [SIZE] = {1, 2, 2, 1, -1, -2, -2, -1}; int currentRow = 3, currentColumn = 4, moveNumber, counter, i, k; int accessibility [SIZE][SIZE] = {2, 3, 4, 4, 4, 4, 3, 2, 3, 4, 6, 6, 6, 6, 4, 3, 4, 6, 8, 8, 8, 8, 6, 4, 4, 6, 8, 8, 8, 8, 6, 4, 4, 6, 8, 8, 8, 8, 6, 4, 4, 6, 8, 8, 8, 8, 6, 4, 3, 4, 6, 6, 6, 6, 4, 3, 2, 3, 4, 4, 4, 4, 3, 2, }; int compare [SIZE] = {0}, l, min = 2; for (counter = 1; counter <= 64; counter++){ // перебирает возможные ходы for (moveNumber = 0; moveNumber <= 7; moveNumber++) { currentRow += vertical[moveNumber]; currentColumn += horizontal[moveNumber]; //проверяет не занята ли клетка и не выходит ли ход за пределы доски if (board[currentRow][currentColumn] == 0 && currentRow <= SIZE - 1 && currentRow >= 0 && currentColumn <= SIZE - 1 && currentColumn >= 0 ){ //записывает значения возможных ходов в массив compare для сравнения compare[moveNumber] = accessibility[currentRow][currentColumn]; currentRow += back_vertical[moveNumber]; currentColumn += back_horizontal[moveNumber]; } // ходит назад else { currentRow += back_vertical[moveNumber]; currentColumn += back_horizontal[moveNumber]; } } // находит минимальное значение из массива accessibility для следующего хода min = compare[0]; for (l = 1; l <= 7; l++){ if (compare[l] <= min) min = compare[l]; } // печать тестовых данных printf("\n"); printf("counter - %d access - %d row - %d column - %d movenr - %d min - %d\n", counter, accessibility[currentRow][currentColumn], currentRow, currentColumn, moveNumber, min); for (i = 0; i <= SIZE - 1; i++) { printf("%d ", compare[i]); } // перебирает возможные ходы for (moveNumber = 0; moveNumber <= 7; moveNumber++) { currentRow += vertical[moveNumber]; currentColumn += horizontal[moveNumber]; //проверяет не занята ли клетка, не выходит ли ход за пределы доски // и является ли данная клетка минимальным значением массива accessibility if (board[currentRow][currentColumn] == 0 && accessibility[currentRow][currentColumn] == min && currentRow <= SIZE - 1 && currentRow >= 0 && currentColumn <= SIZE - 1 && currentColumn >= 0 ){ // нумерует ходы коня по клеткам board[currentRow][currentColumn] = counter; break; } // ходит назад else { currentRow += back_vertical[moveNumber]; currentColumn += back_horizontal[moveNumber]; } } } // печать board printf("\n"); for (i = 0; i <= SIZE - 1 ; i++) { for (k = 0; k <= SIZE - 1; k++) { printf("%2d ", board[i][k]); } printf("\n"); } printf("\n\n"); // печать accessibility for (i = 0; i <= SIZE - 1; i++) { for (k = 0; k <= SIZE - 1; k++) { printf("%2d ", accessibility[i][k]); } printf("\n"); } return 0; }
Объяснение кода листинга программы
В данном коде реализована функция для обхода шахматной доски конем.
- В начале кода объявлены основные переменные:
board
- двумерный массив, представляющий собой шахматную доску размером 8x8, инициализированный нулями;horizontal
иvertical
- массивы восьми возможных ходов коня по горизонтали и вертикали соответственно;back_horizontal
иback_vertical
- массивы ходов обратно, также по горизонтали и вертикали соответственно;currentRow
иcurrentColumn
- текущая строка и столбец на доске, с которых начинается обход;moveNumber
- номер текущего хода;counter
- счетчик, увеличивающийся на единицу при каждом новом ходе;accessibility
- двумерный массив, представляющий собой доступность клеток на доске для хода конем;compare
- массив для сравнения значений доступности клеток;min
- минимальное значение из массиваaccessibility
для следующего хода;l
- переменная для перебора элементов массиваcompare
.
- Затем в цикле
for
перебираются все возможные ходы коня, начиная с первого. В каждой итерации цикла происходит:- смещение текущей строки и столбца на доске на соответствующую позицию в массивах
horizontal
иvertical
; - проверка, что выбранная клетка не занята и находится в пределах доски;
- если условие выполняется, то значение доступности этой клетки записывается в массив
compare
и происходит смещение обратно на предыдущую клетку; - иначе, происходит смещение обратно на предыдущую клетку.
- смещение текущей строки и столбца на доске на соответствующую позицию в массивах
- После перебора всех ходов, в цикле
for
перебираются все клетки доски и проверяется, является ли данная клетка минимальным значением из массиваaccessibility
. Если это так, то на эту клетку ставится номер текущего хода. - В конце кода происходит печать доски и массива
accessibility
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д