Получить все расстановки 8 ладей на шахматной доске - C (СИ)

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

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

Написать программу, которая получает все расстановки 8 ладей на шахматной доске, при которых ни одна ладья не угрожает другой. Прошу помощи, так как только начала учить язык,и не могу осилить эту задачку.Преподаватель требует решения через целочисленный массив(если есть другой вариант,не важно),сама к сожалению не справилась. Буду очень благодарна за помощь.

Решение задачи: «Получить все расстановки 8 ладей на шахматной доске»

textual
Листинг программы
#include <stdio.h>
const int BS = 8;
int board[BS][BS], a[8];  
 
void pr()
{
    printf("\n");    
    for(int i=0; i<BS; i++)
    {
        for(int j=0; j<BS; j++)
            if(board[i][j])
                printf("*");
            else
                printf(".");
        printf("\n");            
    }
 
}
 
void rec(int ii)
{
    if(ii==8)
    {
        pr();
        return;
    }
    for(int i=0; i<BS; i++)
        if(!a[i])
        {
            a[i]=1;
            board[ii][i]=1;
            rec(ii+1);
            board[ii][i]=0;
            a[i]=0;
        }
}
 
int main()
{  
    freopen("output.txt","w",stdout);
    for(int i=0; i<BS; i++)
    {
        a[i]=1;
        board[0][i]=1;
        rec(1);
        board[0][i]=0;
        a[i]=0;
    }   
    return 0;
}

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

В этом коде реализована переборная функция, которая генерирует все возможные расстановки восьми ладей на шахматной доске. Вот список ключевых моментов в коде:

  1. Объявлены массив-доска board размером 8x8 и массив a для хранения меток.
  2. Функция pr() выводит доску на экран.
  3. Функция rec() реализует рекурсивный перебор всех возможных позиций для каждой ладьи.
  4. В функции main() выполняется итерация по всем клеткам доски, начиная с первого столбца.
  5. Для каждой клетки выполняется следующая последовательность действий:
    • Устанавливается метка a[i] в 1, чтобы указать, что клетка в данный момент рассматривается.
    • Устанавливается значение элемента board[0][i] в 1, чтобы указать, что левая верхняя клетка доски занята.
    • Вызывается функция rec() с аргументом 1, чтобы начать рекурсивный перебор для этой клетки.
    • Выводится доска на экран (в файл output.txt).
    • Устанавливается значение элемента board[0][i] обратно в 0, чтобы указать, что левая верхняя клетка доски свободна.
    • Устанавливается метка a[i] обратно в 0, чтобы указать, что клетка больше не рассматривается.
  6. В конце функции main() возвращается 0, чтобы указать, что программа успешно завершилась.

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


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

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

9   голосов , оценка 4.333 из 5
Похожие ответы