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

Объяснение кода листинга программы

В данном коде реализована функция для обхода шахматной доски конем.

  1. В начале кода объявлены основные переменные:
    • board - двумерный массив, представляющий собой шахматную доску размером 8x8, инициализированный нулями;
    • horizontal и vertical - массивы восьми возможных ходов коня по горизонтали и вертикали соответственно;
    • back_horizontal и back_vertical - массивы ходов обратно, также по горизонтали и вертикали соответственно;
    • currentRow и currentColumn - текущая строка и столбец на доске, с которых начинается обход;
    • moveNumber - номер текущего хода;
    • counter - счетчик, увеличивающийся на единицу при каждом новом ходе;
    • accessibility - двумерный массив, представляющий собой доступность клеток на доске для хода конем;
    • compare - массив для сравнения значений доступности клеток;
    • min - минимальное значение из массива accessibility для следующего хода;
    • l - переменная для перебора элементов массива compare.
  2. Затем в цикле for перебираются все возможные ходы коня, начиная с первого. В каждой итерации цикла происходит:
    • смещение текущей строки и столбца на доске на соответствующую позицию в массивах horizontal и vertical;
    • проверка, что выбранная клетка не занята и находится в пределах доски;
    • если условие выполняется, то значение доступности этой клетки записывается в массив compare и происходит смещение обратно на предыдущую клетку;
    • иначе, происходит смещение обратно на предыдущую клетку.
  3. После перебора всех ходов, в цикле for перебираются все клетки доски и проверяется, является ли данная клетка минимальным значением из массива accessibility. Если это так, то на эту клетку ставится номер текущего хода.
  4. В конце кода происходит печать доски и массива accessibility.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.375 из 5