Программирование на Си. Прошу найти ошибку в коде. 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; //когда вызв. ф-ция закончит свою работу обнулить ячейку, т.к. след ячейка в цике ни } //как не сможет иметь такие же координаты... (Освобождение ячейки) } }
Объяснение кода листинга программы
- Объявлена константа SIZE равная 8, что означает размерность матрицы (количество строк и столбцов).
- Создана матрица-шахматная доска Ar размером SIZE на SIZE и инициализирована нулями.
- Создано одномерное поле S размером 1, которое будет использоваться как счетчик.
- В функции main() пользователь вводит координаты первого ферзя (столбец, строка) с помощью функций scanf().
- Координаты сохраняются в переменных r и n.
- Ячейка Ar[r][n] занимает значение 2, что означает, что в этой ячейке стоит ферзь.
- Вызывается функция Qf(r, n, 1), которая является рекурсивной и отвечает за размещение ферзей на доске.
- В функции Qf() реализован алгоритм обратного хода, который проверяет все возможные позиции для следующего ферзя и, если позиция подходит, вызывает себя рекурсивно с новыми координатами.
- Если позиция не подходит, то в этой ячейке ставится 1, что означает, что она заблокирована для ферзя.
- После выхода из рекурсии, в ячейке ставится 0, что означает, что она свободна.
- В функции main() после размещения первого ферзя выводится матрица с помощью функции printf().
- После размещения всех 8 ферзей выводится сообщение о победе.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д