Обход шахматной доски конем (ошибка в коде) - 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.