Программирование на Си. Прошу найти ошибку в коде. 8 Ферзей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пользователь вводит координаты первого ферзя, а по итогам программы получает напечатанную таблицу где: 2- Ферзи 1- Точки которым ферзи угрожают ферзи 0 - Девственные нули. Программа по каким-то не понятным причинам не хочет работать, помогите прошу, пока код проверял все глаза стер, а ошибку все равно не могу найти. Сделал кучу пометок, чтобы было легче разобраться, заранее спасибо за помощь. Сама задача для которой написан этот код https://ru.wikipedia.org/wiki/Задача_о_восьми_ферзях
#include <stdio.h>
#define SIZE 8 //константа для дальнейшей работы
int Ar[SIZE][SIZE] = { 0 }; //создание матрицы-шахматной доски и инициализация всех ячеек нулями
int S[1] = { 1 };   //создание счетчика
void Qf(int, int, int); 
main() {
    int r = -1, n = -1;
    while (r < 0 || r >= SIZE) {   //прием от пользователя координат первого ферзя
        printf("Row: ");             // и проверка на вменяемость полученных данных
        scanf_s("%d", &r);
    }
    while (n < 0 || n >= SIZE) {
        printf("Column: ");
        scanf_s("%d", &n);
    }
    Ar[r][n] = 2;    //занимаем ячейку ферзем т.е. 2
    Qf(r, n, 1);   //вызываем основную ф-цию
    system("pause");
    return 0;
}
void Qf(int r, int n, int move) {
    if (move == SIZE) { //проверка на то стоят ли 8 ферзей на доске уже, если да то:
        for (int i = 0; i < SIZE; i++) { //вывод матрицы
            printf("\n");
            for (int j = 0; j < SIZE; j++)
                printf("%d ", Ar[i][j]);
        }
        S[0]++;  //изменить счетчик выведенных матриц на 1
        printf("\n\n"); 

    }
    else { //иначе:
        
        int a, b;
        for (a = r + 1, b = n + 1; a < SIZE && b < SIZE; a++, b++) Ar[a][b] = 1; //заполнение диагоналей 1-ми для  
        for (a = r - 1, b = n - 1; a >= 0 && b >= 0; a--, b--) Ar[a][b] = 1; //блокировки ячеек которым угрожает
        for (a = r - 1, b = n + 1; a >= 0 && b < SIZE; a--, b++) Ar[a][b] = 1; // текущий ферзь
        for (a = r + 1, b = n - 1; a < SIZE && b >= 0; a++, b--) Ar[a][b] = 1;
 
        for (a = r + 1; a < SIZE; a++) Ar[a][n] = 1;  //аналогичная блокировка вертикали и горизонтали 1-ми
        for (a = r - 1; a >= 0; a--) Ar[a][n] = 1;
        for (b = n + 1; b < SIZE; b++) Ar[r][b] = 1;
        for (b = n - 1; b >= 0; b--) Ar[r][b] = 1;

        for (int i = 0; i < SIZE && S[0] == 1; i++)  //проверка счетчика выведенных матриц и
            for (int j = 0; j < SIZE && S[0] == 1; j++) //если ячейка не является ферзем или не один из уже
                if (Ar[i][j] == 0) { //поставленных ферзей не угрожает ей, то поставить след. ферзя на ее место
                    Ar[i][j] = 2;
                    Qf(i, j, move + 1); //вызов рекурс. ф-ции с новыми данными для работы
                    Ar[i][j] = 0; //когда вызв. ф-ция закончит свою работу обнулить ячейку, т.к. след ячейка в цике ни 
                } //как не сможет иметь такие же координаты... (Освобождение ячейки)
 
    }
 
}

Решение задачи: «Программирование на Си. Прошу найти ошибку в коде. 8 Ферзей»

textual
Листинг программы
#include <stdio.h>
 
const int SIZE = 8;
 
int Ar[SIZE][SIZE] = {0}; //создание матрицы-шахматной доски и инициализация всех ячеек нулями
int S[1] = {1};           //создание счетчика
 
void Qf(int, int, int);
 
int main()
{
    int r = -1, n = -1;
    while (r < 0 || r >= SIZE)
    {                    //прием от пользователя координат первого ферзя
        printf("Row: "); // и проверка на вменяемость полученных данных
        scanf("%d", &r);
    }
    while (n < 0 || n >= SIZE)
    {
        printf("Column: ");
        scanf("%d", &n);
    }
    Ar[r][n] = 2; //занимаем ячейку ферзем т.е. 2
    Qf(r, n, 1);  //вызываем основную ф-цию
    return 0;
}
 
void Qf(int r, int n, int move)
{
    if (move == SIZE)
    { //проверка на то стоят ли 8 ферзей на доске уже, если да то:
        for (int i = 0; i < SIZE; i++)
        { //вывод матрицы
            printf("\n");
            for (int j = 0; j < SIZE; j++)
                printf("%d ", Ar[i][j]);
        }
        S[0]++; //изменить счетчик выведенных матриц на 1
        printf("\n\n");
    }
    else
    { //иначе:
 
        int a, b;
        for (a = r + 1, b = n + 1; a < SIZE && b < SIZE; a++, b++)
            Ar[a][b] = 1; //заполнение диагоналей 1-ми для
        for (a = r - 1, b = n - 1; a >= 0 && b >= 0; a--, b--)
            Ar[a][b] = 1; //блокировки ячеек которым угрожает
        for (a = r - 1, b = n + 1; a >= 0 && b < SIZE; a--, b++)
            Ar[a][b] = 1; // текущий ферзь
        for (a = r + 1, b = n - 1; a < SIZE && b >= 0; a++, b--)
            Ar[a][b] = 1;
 
        for (a = r + 1; a < SIZE; a++)
            Ar[a][n] = 1; //аналогичная блокировка вертикали и горизонтали 1-ми
        for (a = r - 1; a >= 0; a--)
            Ar[a][n] = 1;
        for (b = n + 1; b < SIZE; b++)
            Ar[r][b] = 1;
        for (b = n - 1; b >= 0; b--)
            Ar[r][b] = 1;
 
        for (int i = 0; i < SIZE && S[0] == 1; i++)     //проверка счетчика выведенных матриц и
            for (int j = 0; j < SIZE && S[0] == 1; j++) //если ячейка не является ферзем или не один из уже
                if (Ar[i][j] == 0)
                { //поставленных ферзей не угрожает ей, то поставить след. ферзя на ее место
                    Ar[i][j] = 2;
                    Qf(i, j, move + 1); //вызов рекурс. ф-ции с новыми данными для работы
                    Ar[i][j] = 0;       //когда вызв. ф-ция закончит свою работу обнулить ячейку, т.к. след ячейка в цике ни
                }                       //как не сможет иметь такие же координаты... (Освобождение ячейки)
    }
}

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

  1. Объявлена константа SIZE равная 8, что означает размерность матрицы (количество строк и столбцов).
  2. Создана матрица-шахматная доска Ar размером SIZE на SIZE и инициализирована нулями.
  3. Создано одномерное поле S размером 1, которое будет использоваться как счетчик.
  4. В функции main() пользователь вводит координаты первого ферзя (столбец, строка) с помощью функций scanf().
  5. Координаты сохраняются в переменных r и n.
  6. Ячейка Ar[r][n] занимает значение 2, что означает, что в этой ячейке стоит ферзь.
  7. Вызывается функция Qf(r, n, 1), которая является рекурсивной и отвечает за размещение ферзей на доске.
  8. В функции Qf() реализован алгоритм обратного хода, который проверяет все возможные позиции для следующего ферзя и, если позиция подходит, вызывает себя рекурсивно с новыми координатами.
  9. Если позиция не подходит, то в этой ячейке ставится 1, что означает, что она заблокирована для ферзя.
  10. После выхода из рекурсии, в ячейке ставится 0, что означает, что она свободна.
  11. В функции main() после размещения первого ферзя выводится матрица с помощью функции printf().
  12. После размещения всех 8 ферзей выводится сообщение о победе.

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


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

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

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