Редактирование: Информатика: Расстановка шахматных фигур

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
'''[[Абрамов Игорь]]'''
 
 
'''Алгоритм''': в зависимости от выбранного режима работы, после ввода пользователем необходимой информации о размере поля а также типе расставляемых фигур, запускается основная рекурсивная функция, которая либо подсчитывает все возможные расстановки для заданного числа фигур и выводит их в файл, либо рассчитывает максимально возможное расставляемое число фигур. В первом режиме это происходит путём установки фигуры в свободную клетку и отметки клеток, которые бьются данной фигурой, затем запускается эта же функция для оставшихся клеток и т.д., пока число поставленных фигур не дойдёт до числа, заданного пользователем. Тогда эта расстановка выводится в файл и счётчик числа расстановок увеличивается на единицу. Во втором режиме как только находится расстановка для данного количества фигур, функция завершает свою работу, увеличивается счётчик количества фигур и функция вызывается уже для большего количества фигур, пока не будет найдено максимально возможное расставляемое на данной доске число фигур. 
 
 
'''Инструкция''': В меню пользователю предлагается указать размеры доски, тип расставляемых фигур и режим работы программы. После этого, если был выбран режим вывода всех расстановок, необходимо ввести количество расставляемых фигур, после чего программа выведет на экран количество расстановок, а в файле "output.txt" появятся изображения всех расстановок. При выборе второго режима, на экран будет выведено максимальное число фигур заданного типа, которые можно расставить на данной доске.
 
 
Ссылка для скачивания:[http://tm.spbstu.ru/File:Chess_Abramov.rar]
 
  
 
'''[[Андреева Полина]]'''
 
'''[[Андреева Полина]]'''
Строка 659: Строка 652:
 
</div>
 
</div>
  
'''[[Бальцер Анастасия]]'''
 
 
'''Краткое описание алгоритма''': Для каждой фигуры написана отдельная функция, выполняющая поиск расстановок. После выбора типа фигуры, соответствующая функция выполняет поиск возможных расстановок. Она проходя по строкам двумерного массива пытается поставить фигуру в каждую клетку. Проходя по массиву она маркирует клетки, ставит 0 (если клетка свободна), 1 (если клетка находится под ударом), 2 (если клетка занята). Программа аналитически считает максимальное количество фигур для заданного размера доски, возможное число расстановок для заданных типа фигуры, размера доски и количества фигур.
 
 
'''Инструкция''': При запуске программы появляется меню, в котором каждому типу фигуры сопоставлен номер, с помощью которого пользователь и выбирает тип фигуры. Затем пользователю на выбор предлагается 2 режима работы программы: первый выводит число возможных расстановок на экран, а список возможных расстановок в отдельный файл (при этом пользователь дополнительно выбирает число фигур); второй выводит на экран максимальное число фигур выбранного типа, которые можно расставить на заданной доске.
 
 
Посмотреть программу можно [http://tm.spbstu.ru/Файл:Расстановка.zip тут]
 
  
 
'''[[Белоусова Екатерина]]'''
 
'''[[Белоусова Екатерина]]'''
Строка 1222: Строка 1208:
 
</div>
 
</div>
  
'''[[Васильева Анастасия]]'''
 
  
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива, по ходу программы, в зависимости от алгоритмов для разных фигур, функции заполняют доску числами  0-место свободно, 1-находится под ударом и 2-занято фигурой, потом массив преобразовывается к нормальному виду 0 и 1-фигура. Так программа прогоняет все возможные варианты расстановок. Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
+
'''[[Лебедев Станислав]]'''
  
'''Инструкция''': Сначала программа просит выбрать фигуру, с которой будем работать. Затем 2 варианта развития событий: 1 - вывод в файл всех расстановок, 2 - максимальное количество фигур. В зависимости от выбора, в первом случае еще нужно ввести количество фигур, и программа запишет в файл все возможные варианты и выведет на экран число расстановок, а во втором - на экране появится максимальное кол-во фигур.
+
'''Функционал программы''': получение всевозможных расстановок n однотипных шахматных фигур первой линии на поле n на n,таких,чтобы фигуры не били друг друга(считается,что фигуры одного цвета также могут бить друг друга) или получения максимального количества фигур первой линии,которые могут стоять на доске n*n;
Скачать можно [http://tm.spbstu.ru/Файл:Задача1.zip тут].
 
  
 +
'''Идея алгоритма''': рекурсивно вызывается функция,которая ставит фигуру в пустую и небитую клетку, а также отмечает клетки,которые эта фигура бьет. Рекурсия продолжается до тех пор,пока либо не будет достигнуто нужное количество, либо не будет возможности поставить фигуру. После выхода из рекурсии начинается "обратный ход", в котором отмеченные как битые на этом шаге,"размечаются"(снимается отметка,что эта клетка бьется),а место,занятое самой фигурой, запоминается.
  
'''[[Гильманов Илья]]'''
+
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
  
'''Основная идея программы''': пользователь вводит размер доски MxM , тип фигур, их количество. Программа рассчитывает максимально возможное количество фигур , которые можно расположить на доске, чтобы они не били друг друга.
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <iostream>
 +
#include <math.h>
 +
#include <cmath>
  
'''Инструкция к программе''': Пользователь вводит размер доски M(size*size).А затем предоставляется выбор между нахождением максимально возможного числа фигур , и их расстановкой.Также пользователь выбирает тип фигуры , и количество(если интересует расстановка).
+
using namespace std;
  
Скачать можно [http://mech.spbstu.ru/File:CheEeeSss.rar здесь]
+
int n,type, *a, *stak, variant, maxst = 0;
  
'''[[Демченко Артём]]'''
+
void king(int x, int &top)                      //отметить битые клетки королем
 +
{
 +
    // 012
 +
    // 345
 +
    // 678
  
'''Основная идея программы''': Программа подсчитывает и выводит расстановку указанного кол-ва фигур на указанном поле и второй опицей выводит максимальную расстановку на поле размером size*size.
+
    //0
 
+
    if (((x % n) > 1) && ((x / n) > 1))
'''Инструкция''': Запустите программу и следуйте инструкциям. Сначала идет выбор алгоритма, после чего идет выбор фигуры и размер доски для подсчета максимальной расстановки на поле size*size. Результат будет выведен на экран.
+
    {
 +
        int ii = x - n - 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 +
    }
  
Скачать можно [http://tm.spbstu.ru/File:Chessss.zip тут].
+
    //1
 +
    if ((x / n) > 0)
 +
    {
 +
        int ii = x - n;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 +
    }
  
'''[[Иванова Яна]]'''
+
    //2
 +
    if (((x % n) < (n - 1)) && ((x / n) > 0))
 +
    {
 +
        int ii = x - n + 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 +
    }
  
'''Краткое описание алгоритма''': Функция, которая выполняет поиск расстановок, пытается поставить фигуру в каждую клетку. В случае неудачи программа отмечает клетки, в которых фигура уже побывала, но постановка не удалась, отрицательной величиной, равной по модулю шагу, на котором эта постановка была испробована. В случае пустой клетки она отмечается нулем, в случае успеха клетка отмечается положительным числом, равным шагу, соответствующему попытке постановки.
+
    //3
Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
+
    if ((x % n) > 0)
 +
    {
 +
        int ii = x - 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 +
    }
  
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры.
+
    //5
Если он выбирает максимальное число расстановок, то программа выводит их количество, а также предлагает вывести все расстановки на экран. Другой вариант работы программы - вывод расстановок N фигур.
+
    if ((x % n) < (n - 1))
 
 
Посмотреть программу можно [http://tm.spbstu.ru/Файл:chess(1).zip здесь]
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
 
 
#include <iostream>
 
#include <algorithm>
 
#include <exception>
 
#include <string>
 
#include <algorithm>
 
 
 
//пусть для определенности максимальный размер доски - 128 клеток
 
#define MAX_SIZE 128
 
 
 
// перечисление для определения типа фигуры
 
enum figure_type
 
{
 
    KING,
 
    QUEEN,
 
    ROOK,
 
    BISHOP,
 
    KNIGHT
 
};
 
 
 
// класс для создания доски и расстановки фигур
 
class chess_board
 
{
 
public:
 
    // конструктор (принимает только размеры)
 
    chess_board(const int &size)
 
 
     {
 
     {
         if (size >= 0 && size <= MAX_SIZE)
+
        int ii = x + 1;
 +
         if (a[ii] != -2)
 
         {
 
         {
             size_ = size;
+
             a[ii]++;
             clean_board();
+
            stak[top] = ii;
 +
             top++;
 
         }
 
         }
 +
    }
  
         else
+
    //6
         {
+
    if (((x % n ) > 0) && ((x / n) < (n - 1)))
             std::cout << "wrong size" << std::endl;
+
    {
             throw std::string("wrong size");
+
        int ii = x + n - 1;
 +
         if (a[ii] != -2)
 +
         {
 +
             a[ii]++;
 +
            stak[top] = ii;
 +
             top++;
 
         }
 
         }
 
     }
 
     }
  
 
+
     //7
     // функция очистки доски (занулить все клетки)
+
    if ((x / n ) < (n - 1))
    void clean_board()
 
 
     {
 
     {
         //обнулить счетчик количества фигур на доске
+
         int ii = x + n;
        figures_on_board_ = 0;
+
         if (a[ii] != -2)
         //присвоить всем клеткам значение 0
 
        for (int i = 0; i < size_; ++i)
 
 
         {
 
         {
             for (int j = 0; j < size_; ++j)
+
             a[ii]++;
             {
+
             stak[top] = ii;
                board_[i][j] = 0;
+
             top++;
             }
 
 
         }
 
         }
 
     }
 
     }
  
     // функция, принимающая размер доски
+
     //8
     int get_size()
+
     if (((x % n ) < (n - 1)) && ((x / n) < (n - 1)))
 
     {
 
     {
         return size_;
+
         int ii = x + n + 1;
     }
+
     if (a[ii] != -2)
    // функция, обновляющая количество фигур на доске
+
        {
    int get_figures_number()
+
            a[ii]++;
    {
+
            stak[top] = ii;
         return figures_on_board_;
+
            top++;
 +
         }
 
     }
 
     }
 +
}
  
    //функция, пытающаяся поставить фигуру на свободное место и возвращающая
+
void bishop(int x, int &top)                                                              //отметить битые клетки слоном
     //истину в случае успеха и ложь в случае неудачи
+
{
     bool put_figure (const figure_type& figure, const int& x, const int& y, const int& step)
+
     //вверх влево
 +
     for (int i = (x - (n + 1)); ((i >= 0) && ((i%n) != (n-1))); i -= (n+1))
 
     {
 
     {
         if (board_[x][y] > 0 || board_[x][y] < -step)
+
         if (a[i] != -2)
 
         {
 
         {
          //если здесь уже стоит фигура или мы когда-то пытались ее сюда поставить, вернуть ложь
+
            a[i]++;
             return false;
+
            stak[top] = i;
 +
             top++;
 
         }
 
         }
 +
    }
  
        if (check_figure(figure, x, y))
+
    //вниз вправо
 +
    for (int i = (x + (n + 1)); ((i < n*n) && ((i%n) != 0)); i += (n+1))
 +
    {
 +
        if (a[i] != -2)
 
         {
 
         {
             board_[x][y] = step;
+
             a[i]++;
             ++figures_on_board_;
+
            stak[top] = i;
            return true;
+
             top++;
        }
 
        else
 
        {
 
            return false;
 
 
         }
 
         }
 
     }
 
     }
  
     //отметить клетку как ранее пройденную функцией
+
     //вверх вправо
     //вычесть единицу из количества фигур на доске
+
     for (int i = x - (n - 1); ((i >= 0) && ((i%n) != 0)); i -= (n-1))
    void remove_figure(const int& x, const int& y)
 
 
     {
 
     {
         board_[x][y] *= -1;
+
         if (a[i] != -2)
         --figures_on_board_;
+
        {
 +
            a[i]++;
 +
            stak[top] = i;
 +
            top++;
 +
         }
 
     }
 
     }
  
     //функция печати доски на экран
+
     //вниз влево
     void print() const
+
     for (int i = x + (n - 1); ((i < n*n) && ((i%n) != (n-1))); i += (n-1))
 
     {
 
     {
         using namespace std;
+
         if (a[i] != -2)
        cout << "==========================================" << endl;
 
        for (int i = 0; i < size_; ++i)
 
 
         {
 
         {
             for (int j = 0; j < size_; ++j)
+
             a[i]++;
             {
+
             stak[top] = i;
                //если фигура стоит в клетке, то вывести "*", если нет - вывести "-"
+
             top++;
                cout << (board_[i][j] > 0?"*":"-") << " ";
 
             }
 
            cout << endl;
 
 
         }
 
         }
        cout << "==========================================" << endl;
 
 
     }
 
     }
 +
}
  
private:
+
void knight(int x, int &top)                                            //отметить битые клетки конем
 
+
{
    //функция, проверяющая возможность или невозможность постановки фигуры на данную клетку
+
     if (((x%n) > 0) && (x/n) > 1)
     bool check_figure(const figure_type& figure, const int& x, const int& y)
 
 
     {
 
     {
         //выбор следующего действия в зависимости от типа фигуры
+
         int ii = x - 2*n - 1;
         switch (figure)
+
         if (a[ii] != -2)
 
         {
 
         {
             case KING:
+
             a[ii]++;
                return check_king(x, y);
+
             stak[top] = ii;
            case QUEEN:
+
             top++;
                return check_queen(x, y);
 
            case ROOK:
 
                return check_rook(x, y);
 
            case BISHOP:
 
                return check_bishop(x, y);
 
             case KNIGHT:
 
                return check_knight(x, y);
 
                //в случае ошибки ввода вернуть ложь
 
             default:
 
                return false;
 
 
         }
 
         }
 
     }
 
     }
  
     //поиск расстановок короля
+
     if (((x%n) > 1) && (x/n) > 0)
    bool check_king(const int& x, const int& y)
 
 
     {
 
     {
         int min_x = std::max(x - 1, 0);
+
         int ii = x - n - 2;
        int max_x = std::min(x + 1, size_ - 1);
+
         if (a[ii] != -2)
         int min_y = std::max(y - 1, 0);
 
        int max_y = std::min(y + 1, size_ - 1);
 
 
 
        for (int i = min_x; i <= max_x; ++i)
 
 
         {
 
         {
             for (int j = min_y; j <= max_y; ++j)
+
             a[ii]++;
             {
+
             stak[top] = ii;
                if (board_[i][j] > 0)
+
             top++;
                {
 
                    return false;
 
                }
 
             }
 
 
         }
 
         }
        return true;
 
 
     }
 
     }
  
     //поиск расстановок ладьи
+
     if (((x%n) > 1) && (x/n) < (n - 1))
    bool check_rook(const int& x, const int& y)
 
 
     {
 
     {
         for (int i = 0; i < size_; ++i)
+
         int ii = x + n - 2;
 +
        if (a[ii] != -2)
 
         {
 
         {
             if (board_[i][y] > 0)
+
             a[ii]++;
             {
+
            stak[top] = ii;
                return false;
+
             top++;
            }
 
 
         }
 
         }
         for (int j = 0; j < size_; ++j)
+
    }
 +
 
 +
    if (((x%n) > 0) && (x/n) < (n - 2))
 +
    {
 +
         int ii = x + 2*n - 1;
 +
        if (a[ii] != -2)
 
         {
 
         {
             if (board_[x][j] > 0)
+
             a[ii]++;
             {
+
            stak[top] = ii;
                return false;
+
             top++;
            }
 
 
         }
 
         }
        return true;
 
 
     }
 
     }
  
     //поиск расстановок слона
+
     if (((x%n) < (n - 1)) && (x/n) < (n - 2))
    bool check_bishop(const int& x, const int& y)
 
 
     {
 
     {
         bool check = true;
+
         int ii = x + 2*n + 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 +
    }
  
        int k_start_1 = -std::min(x, y);
+
    if (((x%n) < (n - 2)) && (x/n) < (n - 1))
        int k_end_1 = std::min( size_ - x, size_ - y) - 1;
+
    {
 
+
         int ii = x + n + 2;
        int k_start_2 = -std::min( x, size_ - y - 1);
+
         if (a[ii] != -2)
         int k_end_2 = std::min( y, size_ - x - 1);
 
 
 
 
 
         for (int k = k_start_1; k <= k_end_1; ++k)
 
 
         {
 
         {
             check = check_coord(x + k, y + k) && check ;
+
             a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 
         }
 
         }
         for (int k = k_start_2; k <= k_end_2; ++k)
+
    }
 +
 
 +
    if (((x%n) < (n - 2)) && (x/n) < 0)
 +
    {
 +
         int ii = x - n + 2;
 +
        if (a[ii] != -2)
 
         {
 
         {
             check = check_coord(x + k, y - k) && check;
+
             a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 
         }
 
         }
 
        return check;
 
 
     }
 
     }
  
 
+
     if (((x%n) < (n - 1)) && (x/n) < 1)
     //поиск расстановок коня
 
    bool check_knight(const int& x, const int& y)
 
 
     {
 
     {
         bool check =
+
         int ii = x - 2*n + 1;
            check_coord(x - 2, y - 1) &&
+
        if (a[ii] != -2)
            check_coord(x - 2, y + 1) &&
+
        {
            check_coord(x - 1, y - 2) &&
+
             a[ii]++;
            check_coord(x - 1, y + 2) &&
+
             stak[top] = ii;
             check_coord(x + 1, y - 2) &&
+
             top++;
            check_coord(x + 1, y + 2) &&
+
         }
             check_coord(x + 2, y - 1) &&
 
             check_coord(x + 2, y + 1);
 
         return check;
 
 
     }
 
     }
 +
}
  
    //поиск расстановок королевы
+
void rook(int x, int &top)                                                      //отметить битые клетки ладьей
     bool check_queen(const int& x, const int& y)
+
{
 +
     int k = x - (x % n);
 +
    while ((k/n) == (x/n))
 
     {
 
     {
        return check_rook(x, y) && check_bishop(x, y);
 
    }
 
  
  //функция поиска расстановок, в случае, когда на доске что-то стоит, вернуть ложь
+
         if ((k != x) && (a[k] != -2))
  //иначе поставить вернуть истину
 
    bool check_coord(const int& x, const int& y)
 
    {
 
         if (x >= 0 && x < size_ && y >= 0 && y < size_)
 
 
         {
 
         {
             if (board_[x][y] > 0)
+
             a[k]++;
             {
+
            stak[top] = k;
                return false;
+
             top++;
            }
 
 
         }
 
         }
         return true;
+
         k ++;
 
     }
 
     }
  
     // if board_[x][y] == 0
+
     k = (x % n);
     //    клетка свободна
+
     while (((k/n)) != n)
    // if board_[x][y] == s
+
     {
     //    фигура была поставлена на шаге S
+
        if ((k != x) && (a[k] != -2))
    // if board_[x][y] == -s
+
        {
    //    клетка свободна, но была попытка поставить фигуру на шаге S
+
            a[k]++;
    int board_[MAX_SIZE][MAX_SIZE];
+
            stak[top] = k;
    int size_;
+
            top++;
    int figures_on_board_;
+
        }
};
+
        k += n;
 +
    }
  
//функция расчета максимума для любой доски в зависимости от типа фигуры
+
}
int get_max_figures (const figure_type& figure, const int& size)
+
void set_figure(int x, int &top)                                   //ставим фигуры на доску
 
{
 
{
     switch (figure)
+
    //отмечаем "битые" клетки
 +
     switch (type)
 
     {
 
     {
        case KING:
+
//король
            return (size + 1) / 2;
+
         case 1:
         case QUEEN:
+
        {
            if (size <= 2)
+
             king(x,top);
            {
+
             break;
                return 1;
+
        }
            }
+
 
             else if (size == 3)
+
//слон
            {
+
case 2:
                return 2;
+
{
             }
+
    bishop(x,top);
            else
+
             break;
            {
+
}
                return size;
 
            }
 
        case ROOK:
 
            return size;
 
        case BISHOP:
 
            if (size == 1)
 
            {
 
                return size;
 
            }
 
            else
 
            {
 
                return 2 * (size - 1);
 
            }
 
        case KNIGHT:
 
            if (size <= 2)
 
            {
 
                return size * size;
 
            }
 
            else
 
            {
 
                return (size * size + 1) / 2;
 
             }
 
        default:
 
            return 1;
 
    }
 
}
 
  
//функция для расстановки максимального числа фигур на доске
+
//конь
void place_figures_for_max(chess_board &board, const figure_type& figure, const int& max_figures, int step)
+
case 3:
{
+
{
    ++step;
+
    knight(x,top);
    const int size = board.get_size();
+
break;
    for (int i = 0; i < size; ++i)
+
}
    {
+
//ладья
         for (int j = 0; j < size; ++j)
+
         case 4:
 
         {
 
         {
             //если мы можем поставить фигуру, то добавляем к максимуму единицу и запускаем цикл снова
+
             rook(x,top);
            if (board.put_figure(figure, i, j, step))
+
             break;
             {
+
        }
                //если число фигур на доске достигло максимума, то вывести доску
+
        //ферзь
                if (board.get_figures_number() == max_figures)
+
        case 5:
                {
+
        {
                    board.print();
+
            rook(x,top);
                }
+
            bishop(x,top);
                //если число фигур не достигло максимума, продолжить выполнение функции
+
             break;
                else
 
                {
 
                    place_figures_for_max(board, figure, max_figures, step);
 
                }
 
                board.remove_figure(i, j);
 
             }
 
 
         }
 
         }
 
     }
 
     }
 +
 +
    //отмечаем,что в данной клетке стоит фигура
 +
a[x] = -1;
 +
    stak[top] = x;
 +
    top++;
 
}
 
}
  
//функция, принимающая ввод с клавиатуры как строковый тип данных
+
void step(int top,int x,int st)
figure_type get_figure_type(const std::string& str)
 
 
{
 
{
    using namespace std;
+
int xtop = top;
 
+
switch (variant)
    figure_type figure;
+
{
    if (str == string("king"))
+
case 1:
    {
+
{
        figure = KING;}
+
if (st != (n - 1))
    else if (str == string("queen"))
+
{
    {
+
set_figure(x,top);
        figure = QUEEN;}
+
for (int i = 0; i < (n*n); i++)
    else if (str == string("rook"))
+
if (a[i] == 0)
 +
step(top,i,st + 1);
 +
}
 +
else[[:File:Шахматы.rar]]
 +
{
 +
set_figure(x,top);
 +
                cout << endl;
 +
for (int i = 0; i < (n*n); i++)
 +
{
 +
cout.width(3);
 +
if (((i % n) == 0) && (i != 0))
 +
cout << endl;
 +
if (a[i] == -1)
 +
cout << 1;
 +
else
 +
cout << 0;
 +
}
 +
cout << endl;
 +
}
 +
break;
 +
}
 +
case 2:
 +
{
 +
set_figure(x,top);
 +
if ((st+1) > maxst)
 +
maxst = st + 1;
 +
for (int i = 0; i < (n*n); i++)
 +
if (a[i] == 0)
 +
step(top,i,st+1);
 +
break;
 +
}
 +
}
 +
 
 +
 
 +
 
 +
// обратный ход
 +
    for (int i = xtop; i < top; i++)
 
     {
 
     {
         figure = ROOK;
+
         if ((a[stak[i]] != -1) && (a[stak[i]] != -2))
    }
+
            a[stak[i]]--;
    else if (str == string("bishop"))
+
         else
    {
+
            //не забываем отметить,что фигура уже здесь стояла(чтобы избежать повторов)
         figure = BISHOP;
+
            if (a[stak[i]] == -1)
    }
+
                a[stak[i]] = -2;
    else if (str == string("knight"))
+
//      cerr << " Back "  << stak[i] << endl;
    {
 
      figure = KNIGHT;
 
 
     }
 
     }
    //вывести ошибку в случае неверного ввода
 
    else
 
    {
 
        cout << "wrong figure type" << endl;
 
        throw string("wrong figure type");
 
    }
 
 
    return figure;
 
 
}
 
}
  
 
int main()
 
int main()
 
{
 
{
    //использовать стандартное пространств имен
 
    using namespace std;
 
  
     int size;
+
     //cin >> n >> type >> variant;
    string type_of_figure;
+
     n = 5;
    string type_of_action;
+
     type = 4;
    figure_type figure;
+
variant = 1;
 
+
    a    = new int[n*n];
    cout << "Возможные фигуры: king, queen, rook, bishop, knight" << endl;
+
     stak = new int[n*n*4];
    cout << "Возможные действия: max, placing" << endl;
 
    cout << "----------------------------------------------------" << endl;
 
 
 
    cout <<"Введите размер доски: ";
 
    cin >> size;
 
    chess_board board(size);
 
 
 
    cout << "Введите тип фигуры: ";
 
    cin >> type_of_figure;
 
    figure = get_figure_type(type_of_figure);
 
 
 
    cout << "Введите необходимое действие: ";
 
    cin >> type_of_action;
 
 
 
     if (type_of_action == string("max"))
 
     {
 
 
 
        int max_figures = get_max_figures(figure, size);
 
        cout << "Max figures: " << max_figures << endl;
 
 
 
        cout << "Хотите ли вы просмотреть все варианты? (yes/no) ";
 
        string answer;
 
        cin >> answer;
 
        //если нужно вывести все расстановки, то применить непосредственно функцию поиска расстановок максимума
 
        if (answer == string("yes"))
 
        {
 
            int step = 0;
 
            place_figures_for_max(board, figure, max_figures, step);
 
        }
 
    }
 
    //иначе если нужно расставить определенное количество фигур, то применить функцию поиска расстановок
 
    //относительно введенного числа
 
     else if (type_of_action == string("placing"))
 
    {
 
        int figures_to_place;
 
        cout << "Сколько фигур нужно расставить: ";
 
        cin >> figures_to_place;
 
 
 
        int step = 0;
 
        place_figures_for_max(board, figure, figures_to_place, step);
 
    }
 
    //иначе вывести ошибку действия
 
    else
 
    {
 
        cout << "wrong type of action" << endl;
 
        throw string("wrong type of action");
 
    }
 
  
 +
    for (int i = 0; i < (n*n); i++)
 +
    {
 +
        for (int j = 0; j < (n*n); j++)
 +
            a[j] = 0;
 +
        if (variant == 1)
 +
            cout << "__________________________________" << endl;
 +
        step(0,i,0);
 +
    }
 +
if (variant == 2)
 +
  cout << maxst;
 
     return 0;
 
     return 0;
 
}
 
}
 
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Строка 1683: Строка 1628:
  
  
'''[[Капитанюк Светлана]]'''
+
'''[[Иванова Яна]]'''
  
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива. Если в клетке присутствует фигура, то тогада она обозначается '+', если же клетка осталась путсая, то тогда '0'.
+
'''Краткое описание алгоритма''': Функция, которая выполняет поиск расстановок, пытается поставить фигуру в каждую клетку. В случае неудачи программа отмечает клетки, в которых фигура уже побывала, но постановка не удалась, отрицательной величиной, равной по модулю шагу, на котором эта постановка была испробована. В случае пустой клетки она отмечается нулем, в случае успеха клетка отмечается положительным числом, равным шагу, соответствующему попытке постановки.
 +
Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
  
'''Инструкция''': Инструкция: при запуске программа предлагает пользователю ввести размер доски, при этом число должно быть четным (если же пользователь вводит нечетное число, программа предлагает ввести размер еще раз, и так до тех пор, пока не будет введено четное число). Далее пользователь выбирает режим работы программы - либо расстановка фигур, либо расчет максимального количества фигур. В режиме расстановки фигур программа предлагает выбрать тип фигуры, выводит максимальное число фигур для доски заданного размера и предлагает ввести желаемое число фигур для расстановки (если оно больше максимального, предлагается повторная попытка ввода). В режиме расчета максимального числа программа предлагает выбрать тип фигуры, выводит рассчитанное число и задает вопрос о необходимости вывода всех возможных расстановок максимального количества для данной фигуры. Оба режима работают (т.е. все запросы повторяются) до тех пор, пока пользователь не даст команду на завершение цикла. Кроме того, в программе есть возможность изменения размера доски после выхода из всех циклов. При положительном ответе пользователя и изменении размера доступны оба режима работы.  
+
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры.
 +
Если он выбирает максимальное число расстановок, то программа выводит их количество, а также предлагает вывести все расстановки на экран. Другой вариант работы программы - вывод расстановок N фигур.
  
Скачать можно  [http://tm.spbstu.ru/File:Chess_03.zip тут].
+
Посмотреть программу можно [http://tm.spbstu.ru/Файл:chess(1).zip здесь]
 
 
'''[[Киселёв Лев]]'''
 
 
 
'''Основная идея программы''': реализация задачи о расстановке фигур одинакового типа на произвольной доске MxM
 
Скачать можно [http://mech.spbstu.ru/File:main.rar здесь]
 
 
 
'''[[Козловская Анна]]'''
 
 
 
'''Краткое описание алгоритма:''' Доска представлена в виде динамического массива[m;m], при выводе на экран пустые клетки обозначаются звездочками,а клетки, заполненные фигурами-буквами(каждая буква соответствует первой букве названия фигуры на английском языке). Для всех фигур написаны алгоритмы проверки на возможность расстановки фигуры. После выбора типа фигуры,используется рекурсивная функция,которая проверяет возможные расстановки через данную функцию проверки ,для данного типа фигуры. Во втором варианте работы программы,она аналитически высчитывает максимально возможное количество заданных фигур на доске.В программу встроена функция,проверяющая доску на повторные и симметричные относительно всех осей симметрии способы расстановки фигур.
 
 
 
'''Инструкция:''' В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры и кол-во фигур(для первого типа работы программы).Если он выбирает первый вариант работы программы  - вывод всех различных расстановок N фигур.Другой вариант работы программы максимальное число расстановок- программа выводит их количество.
 
 
 
Скачать можно [http://tm.spbstu.ru/File:Chess3.rar тут].
 
 
 
'''[[Лебедев Станислав]]'''
 
 
 
'''Функционал программы''': получение всевозможных расстановок n однотипных шахматных фигур первой линии на поле n на n,таких,чтобы фигуры не били друг друга(считается,что фигуры одного цвета также могут бить друг друга) или получения максимального количества фигур первой линии,которые могут стоять на доске n*n;
 
 
 
'''Идея алгоритма''': рекурсивно вызывается функция,которая ставит фигуру в пустую и небитую клетку, а также отмечает клетки,которые эта фигура бьет. Рекурсия продолжается до тех пор,пока либо не будет достигнуто нужное количество, либо не будет возможности поставить фигуру. После выхода из рекурсии начинается "обратный ход", в котором отмеченные как битые на этом шаге,"размечаются"(снимается отметка,что эта клетка бьется),а место,занятое самой фигурой, запоминается.
 
 
 
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
 
  
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
 
#include <iostream>
 
#include <iostream>
#include <math.h>
+
#include <algorithm>
#include <cmath>
+
#include <exception>
 +
#include <string>
 +
#include <algorithm>
  
using namespace std;
+
//пусть для определенности максимальный размер доски - 128 клеток
 +
#define MAX_SIZE 128
  
int n,type, *a, *stak, variant, maxst = 0;
+
// перечисление для определения типа фигуры
 
+
enum figure_type
void king(int x, int &top)                      //отметить битые клетки королем
 
 
{
 
{
     // 012
+
     KING,
     // 345
+
     QUEEN,
     // 678
+
     ROOK,
 +
    BISHOP,
 +
    KNIGHT
 +
};
  
     //0
+
// класс для создания доски и расстановки фигур
     if (((x % n) > 1) && ((x / n) > 1))
+
class chess_board
 +
{
 +
public:
 +
     // конструктор (принимает только размеры)
 +
     chess_board(const int &size)
 
     {
 
     {
        int ii = x - n - 1;
+
         if (size >= 0 && size <= MAX_SIZE)
         if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             size_ = size;
            stak[top] = ii;
+
             clean_board();
             top++;
 
 
         }
 
         }
    }
 
  
    //1
+
         else
    if ((x / n) > 0)
 
    {
 
         int ii = x - n;
 
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             std::cout << "wrong size" << std::endl;
             stak[top] = ii;
+
             throw std::string("wrong size");
            top++;
 
 
         }
 
         }
 
     }
 
     }
  
     //2
+
 
     if (((x % n) < (n - 1)) && ((x / n) > 0))
+
     // функция очистки доски (занулить все клетки)
 +
     void clean_board()
 
     {
 
     {
         int ii = x - n + 1;
+
         //обнулить счетчик количества фигур на доске
         if (a[ii] != -2)
+
        figures_on_board_ = 0;
 +
         //присвоить всем клеткам значение 0
 +
        for (int i = 0; i < size_; ++i)
 
         {
 
         {
             a[ii]++;
+
             for (int j = 0; j < size_; ++j)
             stak[top] = ii;
+
             {
             top++;
+
                board_[i][j] = 0;
 +
             }
 
         }
 
         }
 
     }
 
     }
  
     //3
+
     // функция, принимающая размер доски
     if ((x % n) > 0)
+
     int get_size()
 
     {
 
     {
         int ii = x - 1;
+
         return size_;
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
 
     }
 
     }
 
+
     // функция, обновляющая количество фигур на доске
     //5
+
     int get_figures_number()
     if ((x % n) < (n - 1))
 
 
     {
 
     {
         int ii = x + 1;
+
         return figures_on_board_;
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
 
     }
 
     }
  
     //6
+
     //функция, пытающаяся поставить фигуру на свободное место и возвращающая
     if (((x % n ) > 0) && ((x / n) < (n - 1)))
+
     //истину в случае успеха и ложь в случае неудачи
 +
    bool put_figure (const figure_type& figure, const int& x, const int& y, const int& step)
 
     {
 
     {
        int ii = x + n - 1;
+
         if (board_[x][y] > 0 || board_[x][y] < -step)
         if (a[ii] != -2)
 
 
         {
 
         {
            a[ii]++;
+
          //если здесь уже стоит фигура или мы когда-то пытались ее сюда поставить, вернуть ложь
            stak[top] = ii;
+
             return false;
             top++;
 
 
         }
 
         }
    }
 
  
    //7
+
        if (check_figure(figure, x, y))
    if ((x / n ) < (n - 1))
 
    {
 
        int ii = x + n;
 
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             board_[x][y] = step;
            stak[top] = ii;
+
             ++figures_on_board_;
             top++;
+
            return true;
 
         }
 
         }
    }
+
         else
 
 
    //8
 
    if (((x % n ) < (n - 1)) && ((x / n) < (n - 1)))
 
    {
 
         int ii = x + n + 1;
 
    if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             return false;
            stak[top] = ii;
 
            top++;
 
 
         }
 
         }
 
     }
 
     }
}
 
  
void bishop(int x, int &top)                                                              //отметить битые клетки слоном
+
    //отметить клетку как ранее пройденную функцией
{
+
     //вычесть единицу из количества фигур на доске
     //вверх влево
+
     void remove_figure(const int& x, const int& y)
     for (int i = (x - (n + 1)); ((i >= 0) && ((i%n) != (n-1))); i -= (n+1))
 
 
     {
 
     {
         if (a[i] != -2)
+
         board_[x][y] *= -1;
        {
+
        --figures_on_board_;
            a[i]++;
 
            stak[top] = i;
 
            top++;
 
        }
 
 
     }
 
     }
  
     //вниз вправо
+
     //функция печати доски на экран
     for (int i = (x + (n + 1)); ((i < n*n) && ((i%n) != 0)); i += (n+1))
+
     void print() const
 
     {
 
     {
         if (a[i] != -2)
+
         using namespace std;
 +
        cout << "==========================================" << endl;
 +
        for (int i = 0; i < size_; ++i)
 
         {
 
         {
             a[i]++;
+
             for (int j = 0; j < size_; ++j)
             stak[top] = i;
+
             {
             top++;
+
                //если фигура стоит в клетке, то вывести "*", если нет - вывести "-"
 +
                cout << (board_[i][j] > 0?"*":"-") << " ";
 +
             }
 +
            cout << endl;
 
         }
 
         }
 +
        cout << "==========================================" << endl;
 
     }
 
     }
  
     //вверх вправо
+
private:
     for (int i = x - (n - 1); ((i >= 0) && ((i%n) != 0)); i -= (n-1))
+
 
 +
     //функция, проверяющая возможность или невозможность постановки фигуры на данную клетку
 +
     bool check_figure(const figure_type& figure, const int& x, const int& y)
 
     {
 
     {
         if (a[i] != -2)
+
         //выбор следующего действия в зависимости от типа фигуры
 +
        switch (figure)
 
         {
 
         {
             a[i]++;
+
             case KING:
             stak[top] = i;
+
                return check_king(x, y);
             top++;
+
            case QUEEN:
 +
                return check_queen(x, y);
 +
            case ROOK:
 +
                return check_rook(x, y);
 +
            case BISHOP:
 +
                return check_bishop(x, y);
 +
             case KNIGHT:
 +
                return check_knight(x, y);
 +
                //в случае ошибки ввода вернуть ложь
 +
             default:
 +
                return false;
 
         }
 
         }
 
     }
 
     }
  
     //вниз влево
+
     //поиск расстановок короля
     for (int i = x + (n - 1); ((i < n*n) && ((i%n) != (n-1))); i += (n-1))
+
     bool check_king(const int& x, const int& y)
 
     {
 
     {
         if (a[i] != -2)
+
         int min_x = std::max(x - 1, 0);
         {
+
        int max_x = std::min(x + 1, size_ - 1);
             a[i]++;
+
        int min_y = std::max(y - 1, 0);
             stak[top] = i;
+
        int max_y = std::min(y + 1, size_ - 1);
             top++;
+
 
 +
        for (int i = min_x; i <= max_x; ++i)
 +
         {
 +
             for (int j = min_y; j <= max_y; ++j)
 +
             {
 +
                if (board_[i][j] > 0)
 +
                {
 +
                    return false;
 +
                }
 +
             }
 
         }
 
         }
 +
        return true;
 
     }
 
     }
}
 
  
void knight(int x, int &top)                                            //отметить битые клетки конем
+
    //поиск расстановок ладьи
{
+
     bool check_rook(const int& x, const int& y)
     if (((x%n) > 0) && (x/n) > 1)
 
 
     {
 
     {
         int ii = x - 2*n - 1;
+
         for (int i = 0; i < size_; ++i)
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             if (board_[i][y] > 0)
             stak[top] = ii;
+
             {
             top++;
+
                return false;
 +
             }
 
         }
 
         }
    }
+
        for (int j = 0; j < size_; ++j)
 
 
    if (((x%n) > 1) && (x/n) > 0)
 
    {
 
        int ii = x - n - 2;
 
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             if (board_[x][j] > 0)
             stak[top] = ii;
+
             {
             top++;
+
                return false;
 +
             }
 
         }
 
         }
 +
        return true;
 
     }
 
     }
  
     if (((x%n) > 1) && (x/n) < (n - 1))
+
     //поиск расстановок слона
 +
    bool check_bishop(const int& x, const int& y)
 
     {
 
     {
         int ii = x + n - 2;
+
        bool check = true;
         if (a[ii] != -2)
+
 
 +
        int k_start_1 = -std::min(x, y);
 +
         int k_end_1 = std::min( size_ - x, size_ - y) - 1;
 +
 
 +
         int k_start_2 = -std::min( x, size_ - y - 1);
 +
        int k_end_2 = std::min( y, size_ - x - 1);
 +
 
 +
 
 +
        for (int k = k_start_1; k <= k_end_1; ++k)
 
         {
 
         {
             a[ii]++;
+
             check = check_coord(x + k, y + k) && check ;
            stak[top] = ii;
 
            top++;
 
 
         }
 
         }
    }
+
        for (int k = k_start_2; k <= k_end_2; ++k)
 
 
    if (((x%n) > 0) && (x/n) < (n - 2))
 
    {
 
        int ii = x + 2*n - 1;
 
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             check = check_coord(x + k, y - k) && check;
            stak[top] = ii;
 
            top++;
 
 
         }
 
         }
 +
 +
        return check;
 
     }
 
     }
  
    if (((x%n) < (n - 1)) && (x/n) < (n - 2))
 
    {
 
        int ii = x + 2*n + 1;
 
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
    }
 
  
     if (((x%n) < (n - 2)) && (x/n) < (n - 1))
+
     //поиск расстановок коня
 +
    bool check_knight(const int& x, const int& y)
 
     {
 
     {
         int ii = x + n + 2;
+
         bool check =
        if (a[ii] != -2)
+
            check_coord(x - 2, y - 1) &&
        {
+
            check_coord(x - 2, y + 1) &&
             a[ii]++;
+
            check_coord(x - 1, y - 2) &&
             stak[top] = ii;
+
            check_coord(x - 1, y + 2) &&
             top++;
+
            check_coord(x + 1, y - 2) &&
         }
+
             check_coord(x + 1, y + 2) &&
 +
             check_coord(x + 2, y - 1) &&
 +
             check_coord(x + 2, y + 1);
 +
         return check;
 
     }
 
     }
  
     if (((x%n) < (n - 2)) && (x/n) < 0)
+
     //поиск расстановок королевы
 +
    bool check_queen(const int& x, const int& y)
 
     {
 
     {
         int ii = x - n + 2;
+
         return check_rook(x, y) && check_bishop(x, y);
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
 
     }
 
     }
  
     if (((x%n) < (n - 1)) && (x/n) < 1)
+
  //функция поиска расстановок, в случае, когда на доске что-то стоит, вернуть ложь
 +
  //иначе поставить вернуть истину
 +
     bool check_coord(const int& x, const int& y)
 
     {
 
     {
         int ii = x - 2*n + 1;
+
         if (x >= 0 && x < size_ && y >= 0 && y < size_)
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             if (board_[x][y] > 0)
             stak[top] = ii;
+
             {
             top++;
+
                return false;
 +
             }
 
         }
 
         }
 +
        return true;
 
     }
 
     }
}
 
  
void rook(int x, int &top)                                                      //отметить битые клетки ладьей
+
    // if board_[x][y] == 0
{
+
    //    клетка свободна
     int k = x - (x % n);
+
    // if board_[x][y] == s
     while ((k/n) == (x/n))
+
    //    фигура была поставлена на шаге S
     {
+
     // if board_[x][y] == -s
 +
     //     клетка свободна, но была попытка поставить фигуру на шаге S
 +
     int board_[MAX_SIZE][MAX_SIZE];
 +
    int size_;
 +
    int figures_on_board_;
 +
};
  
        if ((k != x) && (a[k] != -2))
+
//функция расчета максимума для любой доски в зависимости от типа фигуры
        {
+
int get_max_figures (const figure_type& figure, const int& size)
            a[k]++;
 
            stak[top] = k;
 
            top++;
 
        }
 
        k ++;
 
    }
 
 
 
    k = (x % n);
 
    while (((k/n)) != n)
 
    {
 
        if ((k != x) && (a[k] != -2))
 
        {
 
            a[k]++;
 
            stak[top] = k;
 
            top++;
 
        }
 
        k += n;
 
    }
 
 
 
}
 
void set_figure(int x, int &top)                                   //ставим фигуры на доску
 
 
{
 
{
    //отмечаем "битые" клетки
+
     switch (figure)
     switch (type)
 
 
     {
 
     {
//король
+
        case KING:
         case 1:
+
            return (size + 1) / 2;
         {
+
         case QUEEN:
             king(x,top);
+
            if (size <= 2)
             break;
+
            {
         }
+
                return 1;
 +
            }
 +
            else if (size == 3)
 +
            {
 +
                return 2;
 +
            }
 +
            else
 +
            {
 +
                return size;
 +
            }
 +
        case ROOK:
 +
            return size;
 +
         case BISHOP:
 +
            if (size == 1)
 +
            {
 +
                return size;
 +
            }
 +
            else
 +
            {
 +
                return 2 * (size - 1);
 +
            }
 +
        case KNIGHT:
 +
             if (size <= 2)
 +
            {
 +
                return size * size;
 +
             }
 +
            else
 +
            {
 +
                return (size * size + 1) / 2;
 +
            }
 +
         default:
 +
            return 1;
 +
    }
 +
}
  
//слон
+
//функция для расстановки максимального числа фигур на доске
case 2:
+
void place_figures_for_max(chess_board &board, const figure_type& figure, const int& max_figures, int step)
{
+
{
    bishop(x,top);
+
    ++step;
            break;
+
    const int size = board.get_size();
}
+
    for (int i = 0; i < size; ++i)
 
+
    {
//конь
+
        for (int j = 0; j < size; ++j)
case 3:
 
{
 
    knight(x,top);
 
break;
 
}
 
//ладья
 
        case 4:
 
 
         {
 
         {
             rook(x,top);
+
             //если мы можем поставить фигуру, то добавляем к максимуму единицу и запускаем цикл снова
             break;
+
            if (board.put_figure(figure, i, j, step))
        }
+
             {
        //ферзь
+
                //если число фигур на доске достигло максимума, то вывести доску
        case 5:
+
                if (board.get_figures_number() == max_figures)
        {
+
                {
            rook(x,top);
+
                    board.print();
            bishop(x,top);
+
                }
             break;
+
                //если число фигур не достигло максимума, продолжить выполнение функции
 +
                else
 +
                {
 +
                    place_figures_for_max(board, figure, max_figures, step);
 +
                }
 +
                board.remove_figure(i, j);
 +
             }
 
         }
 
         }
 
     }
 
     }
 
    //отмечаем,что в данной клетке стоит фигура
 
a[x] = -1;
 
    stak[top] = x;
 
    top++;
 
 
}
 
}
  
void step(int top,int x,int st)
+
//функция, принимающая ввод с клавиатуры как строковый тип данных
 +
figure_type get_figure_type(const std::string& str)
 
{
 
{
int xtop = top;
+
    using namespace std;
switch (variant)
 
{
 
case 1:
 
{
 
if (st != (n - 1))
 
{
 
set_figure(x,top);
 
for (int i = 0; i < (n*n); i++)
 
if (a[i] == 0)
 
step(top,i,st + 1);
 
}
 
else[[:File:Шахматы.rar]]
 
{
 
set_figure(x,top);
 
                cout << endl;
 
for (int i = 0; i < (n*n); i++)
 
{
 
cout.width(3);
 
if (((i % n) == 0) && (i != 0))
 
cout << endl;
 
if (a[i] == -1)
 
cout << 1;
 
else
 
cout << 0;
 
}
 
cout << endl;
 
}
 
break;
 
}
 
case 2:
 
{
 
set_figure(x,top);
 
if ((st+1) > maxst)
 
maxst = st + 1;
 
for (int i = 0; i < (n*n); i++)
 
if (a[i] == 0)
 
step(top,i,st+1);
 
break;
 
}
 
}
 
  
 
+
    figure_type figure;
 
+
    if (str == string("king"))
// обратный ход
+
    {
     for (int i = xtop; i < top; i++)
+
        figure = KING;}
 +
    else if (str == string("queen"))
 +
    {
 +
        figure = QUEEN;}
 +
     else if (str == string("rook"))
 +
    {
 +
        figure = ROOK;
 +
    }
 +
    else if (str == string("bishop"))
 +
    {
 +
        figure = BISHOP;
 +
    }
 +
    else if (str == string("knight"))
 +
    {
 +
      figure = KNIGHT;
 +
    }
 +
    //вывести ошибку в случае неверного ввода
 +
    else
 
     {
 
     {
         if ((a[stak[i]] != -1) && (a[stak[i]] != -2))
+
         cout << "wrong figure type" << endl;
            a[stak[i]]--;
+
        throw string("wrong figure type");
        else
 
            //не забываем отметить,что фигура уже здесь стояла(чтобы избежать повторов)
 
            if (a[stak[i]] == -1)
 
                a[stak[i]] = -2;
 
//      cerr << " Back " << stak[i] << endl;
 
 
     }
 
     }
 +
 +
    return figure;
 
}
 
}
  
 
int main()
 
int main()
 
{
 
{
 +
    //использовать стандартное пространств имен
 +
    using namespace std;
  
     //cin >> n >> type >> variant;
+
     int size;
    n = 5;
+
     string type_of_figure;
     type = 4;
+
     string type_of_action;
variant = 1;
+
     figure_type figure;
     a    = new int[n*n];
 
     stak = new int[n*n*4];
 
  
     for (int i = 0; i < (n*n); i++)
+
     cout << "Возможные фигуры: king, queen, rook, bishop, knight" << endl;
     {
+
     cout << "Возможные действия: max, placing" << endl;
        for (int j = 0; j < (n*n); j++)
+
     cout << "----------------------------------------------------" << endl;
            a[j] = 0;
 
        if (variant == 1)
 
            cout << "__________________________________" << endl;
 
        step(0,i,0);
 
     }
 
if (variant == 2)
 
  cout << maxst;
 
    return 0;
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Лобанов Илья]]'''
+
    cout <<"Введите размер доски: ";
 +
    cin >> size;
 +
    chess_board board(size);
  
'''Описание алгоритма''':
+
    cout << "Введите тип фигуры: ";
 +
    cin >> type_of_figure;
 +
    figure = get_figure_type(type_of_figure);
  
Программа проверяет возможность расстановки фигур на доске M*M . При выводе на экран на экран клетки,занятые фигурами ,помечаются буквами,соответствующими первой букве типа фигуры. Также программа считает максимальное число фигур определенного типа,которые можно расставить на доске.
+
    cout << "Введите необходимое действие: ";
 +
    cin >> type_of_action;
  
'''Инструкция''':
+
    if (type_of_action == string("max"))
 +
    {
  
В окне консоли пользователю предлагается выбрать 2 типа работы программы, затем пользователь вводит размер доски(четный),тип и количество фигур,которые необходимо разместить на доске.В зависимости от режима работы программы ,будет выведено либо максимально возможное число расстановок фигур,либо максимальное число фигур.
+
        int max_figures = get_max_figures(figure, size);
Скачать можно [[http://tm.spbstu.ru/File:ConsoleApplication54.rar тут]]
+
        cout << "Max figures: " << max_figures << endl;
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        cout << "Хотите ли вы просмотреть все варианты? (yes/no) ";
#include <iostream>
+
        string answer;
#include <windows.h>
+
        cin >> answer;
using namespace std;
+
        //если нужно вывести все расстановки, то применить непосредственно функцию поиска расстановок максимума
 +
        if (answer == string("yes"))
 +
        {
 +
            int step = 0;
 +
            place_figures_for_max(board, figure, max_figures, step);
 +
        }
 +
    }
 +
    //иначе если нужно расставить определенное количество фигур, то применить функцию поиска расстановок
 +
    //относительно введенного числа
 +
    else if (type_of_action == string("placing"))
 +
    {
 +
        int figures_to_place;
 +
        cout << "Сколько фигур нужно расставить: ";
 +
        cin >> figures_to_place;
 +
 
 +
        int step = 0;
 +
        place_figures_for_max(board, figure, figures_to_place, step);
 +
    }
 +
    //иначе вывести ошибку действия
 +
    else
 +
    {
 +
        cout << "wrong type of action" << endl;
 +
        throw string("wrong type of action");
 +
    }
 +
 
 +
    return 0;
 +
}
  
enum type{peshka, king, kon, ladya, slon, queen}; // все возможные типы фигур
 
const char symbols[] = "pKklsQ"; // буквенное обозначение каждой фигуры:p - пешка, K - король, k - конь, l- ладья, s - слон, Q - ферзь
 
const int NONE = INT_MAX;//константа для обозначения пустой клетки
 
int M, **desk, *colons, *rows, *diag_1, *diag_2;
 
  
// структура для описания клектки доски
+
</syntaxhighlight>
struct point
+
</div>
{
+
 
int x, y;
+
'''[[Бальцер Анастасия]]'''
point(int x = 0, int y = 0): x(x), y(y) {}
+
 
point &operator++()
+
'''Краткое описание алгоритма''': Для каждой фигуры написана отдельная функция, выполняющая поиск расстановок. После выбора типа фигуры, соответствующая функция выполняет поиск возможных расстановок. Она проходя по строкам двумерного массива пытается поставить фигуру в каждую клетку. Проходя по массиву она маркирует клетки, ставит 0 (если клетка свободна), 1 (если клетка находится под ударом), 2 (если клетка занята). Программа аналитически считает максимальное количество фигур для заданного размера доски, возможное число расстановок для заданных типа фигуры, размера доски и количества фигур.
{
 
if (y == M - 1)
 
{
 
++x;
 
y = 0;
 
}
 
else
 
++y;
 
return *this;
 
}
 
point operator+(const point &p) const
 
{
 
return point(x + p.x, y + p.y);
 
}
 
point next() const
 
{
 
point r = *this;
 
return ++r;
 
}
 
};
 
  
 +
'''Инструкция''': При запуске программы появляется меню, в котором каждому типу фигуры сопоставлен номер, с помощью которого пользователь и выбирает тип фигуры. Затем пользователю на выбор предлагается 2 режима работы программы: первый выводит число возможных расстановок на экран, а список возможных расстановок в отдельный файл (при этом пользователь дополнительно выбирает число фигур); второй выводит на экран максимальное число фигур выбранного типа, которые можно расставить на заданной доске.
  
int *new_array(int n)
+
Посмотреть программу можно [http://tm.spbstu.ru/Файл:Расстановка.zip тут]
{
 
int *a = new int[n];
 
fill(a, a + n, NONE);
 
return a;
 
}
 
  
// Количество свободных клеток от клетки p до конца доски
 
int rest(const point &p, type t)
 
{
 
int r0 = (M - p.x) * M - p.y, r,
 
m = M - p.x,
 
s_2 = (m + 1) / 2 * M;
 
switch (t)
 
{
 
case peshka:
 
case kon:
 
r = s_2; break;
 
case king:
 
r = s_2 / 2; break;
 
case ladya:
 
case queen:
 
return m;
 
case slon:
 
r = m + M - 1;
 
}
 
return min(r0, r);
 
}
 
  
// Помечает клетку доски номером i
 
void set(const point &p, type t, int i)
 
{
 
if (t == peshka || t == king || t == kon)
 
desk[p.x][p.y] = i;
 
else
 
{
 
if (t == ladya || t == queen)
 
colons[p.y] = rows[p.x] = i;
 
if (t == slon || t == queen)
 
diag_1[p.x+p.y] = diag_2[p.x-p.y+M-1] = i;
 
}
 
}
 
  
// Можно ли поставить фигуру номер i на клетку p
+
'''[[Васильева Анастасия]]'''
bool empty(const point &p, type t, int i)
+
 
{
+
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива, по ходу программы, в зависимости от алгоритмов для разных фигур, функции заполняют доску числами  0-место свободно, 1-находится под ударом и 2-занято фигурой, потом массив преобразовывается к нормальному виду 0 и 1-фигура. Так программа прогоняет все возможные варианты расстановок. Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
const int n_attack[3] = {4, 8, 8};
+
 
const point attack[3][8] = {{point(1, 1), point(1, -1), point(-1, 1), point(-1, -1)}, //кол-во вариантов атаки для пешки
+
'''Инструкция''': Сначала программа просит выбрать фигуру, с которой будем работать. Затем 2 варианта развития событий: 1 - вывод в файл всех расстановок, 2 - максимальное количество фигур. В зависимости от выбора, в первом случае еще нужно ввести количество фигур, и программа запишет в файл все возможные варианты и выведет на экран число расстановок, а во втором - на экране появится максимальное кол-во фигур.
{point(1, 1), point(1, -1), point(-1, 1), point(-1, -1), point(1, 0), point(-1, 0), point(0, 1), point(0, -1)}, // кол-во вариантов атаки для короля
+
Скачать можно [http://tm.spbstu.ru/Файл:Задача1.zip тут].  
{point(1, 2),point(-1, 2),point(1, -2), point (-1,-2), point (2, 1), point (2,-1), point (-2, 1),point (-2,-1)}};  //количество вариантов атаки для коня
 
switch(t)
 
{
 
case peshka:
 
case king:
 
case kon:
 
for (int k = 0; k < n_attack[t]; k++)
 
{
 
point q = p + attack[t][k];
 
if (q.x >= 0 && q.x < M && q.y >= 0 && q.y < M && desk[q.x][q.y] < i)
 
return false;
 
}
 
return true;
 
case ladya:
 
return colons[p.y] > i && rows[p.x] > i;
 
case slon:
 
return diag_1[p.x+p.y] > i && diag_2[p.x-p.y+M-1] > i;
 
case queen:
 
return colons[p.y] > i && rows[p.x] > i && diag_1[p.x+p.y] > i && diag_2[p.x-p.y+M-1] > i;
 
}
 
}
 
  
//печатает заданное количество досок на экране
+
'''[[Тимошенко Валентина]]'''
void print(point **figures, int n_desks, int N, type t, ostream &out = cout)
+
 
{
+
'''Краткое описание алгоритма''': доска представлена в виде динамического массива, при выводе на экран пустые клетки обозначаются точками, а клетки, заполненные фигурами, обозначаются буквами (каждая буква соответствует первой букве названия фигуры на английском языке). Для каждой фигуры написаны функции проверки на возможность установки фигуры и функции расстановки. Кроме того, программа аналитически считает максимальное количество фигур для доски заданного пользователем размера и, при наличии команды пользователя, выводит все возможные расстановки рассчитанного максимального количества фигур на экран.
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
+
 
for (int n = 0; n < n_desks; n++)
+
'''Инструкция''': при запуске программа предлагает пользователю ввести размер доски, при этом число должно быть четным (если же пользователь вводит нечетное число, программа предлагает ввести размер еще раз, и так до тех пор, пока не будет введено четное число). Далее пользователь выбирает режим работы программы - либо расстановка фигур, либо расчет максимального количества фигур. В режиме расстановки фигур программа предлагает выбрать тип фигуры, выводит максимальное число фигур для доски заданного размера и предлагает ввести желаемое число фигур для расстановки (если оно больше максимального, предлагается повторная попытка ввода). В режиме расчета максимального числа программа предлагает выбрать тип фигуры, выводит рассчитанное число и задает вопрос о необходимости вывода всех возможных расстановок максимального количества для данной фигуры. Оба режима работают (т.е. все запросы повторяются) до тех пор, пока пользователь не даст команду на завершение цикла. Кроме того, в программе есть возможность изменения размера доски после выхода из всех циклов. При положительном ответе пользователя и изменении размера доступны оба режима работы.
{
+
 
out << " \xdb";
+
Скачать можно  [http://tm.spbstu.ru/Файл:Chessboard.zip здесь].
for (int i = 0; i < M * 2 + 2; i++)
 
out << "\xdf";
 
out << "\xdb";
 
}
 
out << endl;
 
  
int *K = new int[n_desks];
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
fill(K, K + n_desks, 0);
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
for (int i = 0; i < M; i++)
 
{
 
for (int n = 0; n < n_desks; n++)
 
{
 
int &k = K[n];
 
out << " \xdb ";
 
for (int j = 0; j < M; j++)
 
{
 
SetConsoleTextAttribute(hConsole, (i + j) % 2 == 0 ? 0xf0 : 0xf);
 
if (k < N && i == figures[n][k].x && j == figures[n][k].y)
 
{
 
out << ' ' << symbols[t];
 
k++;
 
}
 
else
 
out << " ";
 
}
 
SetConsoleTextAttribute(hConsole, 0x70);
 
out << " \xdb";
 
}
 
out << endl;
 
}
 
delete[] K;
 
  
for (int n = 0; n < n_desks; n++)
+
#include <iostream> ///расстановка одинаковых шахматных фигур одного цвета на доске произвольного размера так, чтобы они друг друга не били
{
+
#include <cstring>
out << " \xdb";
+
#include <cstdlib>
for (int i = 0; i < M * 2 + 2; i++)
+
#include <ctime>
out << "\xdc";
+
 
out << "\xdb";
+
using namespace std;
}
+
int result_count = 0; ///переменная, в которую закладывается номер варианта расстановки фигур
out << endl << endl;
+
int N; ///то количество фигур для расстановки, которое задает пользователь
 +
int **Board; ///двумерный массив для отображения шахматной доски
 +
int M; /// размер шахматной доски
 +
 
 +
///Функция вывода доски
 +
void showBoard(string F) ///данная функция отображает доску
 +
{
 +
    for(int i = 0; i < M; ++i) /// цикл, прогоняющий значения по строкам
 +
    {
 +
        for(int j = 0; j < M; ++j) /// цикл, прогоняющий значения по столбцам
 +
            cout << ((Board[i][j]) ? F : "."); ///заполнение как строки, так и столбца символом, который обозначает позицию на шахматной доске
 +
        cout << endl;                         ///точка - если данная клетка пустая, буква - если в клетке стоит соответствующая фигура
 +
    }
 +
    cout << "Result # " << ++result_count << "\n\n"; ///вывод номера варианта расположения с последующим переходом на новую строку
 +
    return;
 
}
 
}
  
// Вывести все возможные расположения на доске N фигур
+
///Функции проверки и установки для ферзя
void all_placements(int N, type t)
+
 
 +
bool tryQueen(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
{
desk = NULL;
+
    for (int i = 0; i < M; ++i) ///проверка единственности ферзя в строке
colons = rows = diag_1 = diag_2 = NULL;
+
    {
// создание необходимых массивов, отмечающих занятость клеток, в зависимости от вида фигуры
+
        if(Board[a][i])
if (t == peshka || t == king || t == kon)
+
            return false;
{
+
    }
desk = new int*[M];
+
 
for (int j = 0; j < M; j++)
+
    for(int i = 0; i < M; ++i) ///проверка единственности ферзя в столбце
desk[j] = new_array(M);
+
    {
}
+
        if(Board[i][b])
else
+
            return false;
{
+
    }
if (t == ladya || t == queen)
+
 
{
+
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вверх
colons = new_array(M);
+
    {
rows = new_array(M);
+
        if(Board[a-i][b-i])
}
+
            return false;
if (t == slon || t == queen)
+
    }
{
 
diag_1 = new_array(2*M-1);
 
diag_2 = new_array(2*M-1);
 
}
 
}
 
 
const int W = 80 / (2 * M + 5);//количество досок,помещающихся на экране
 
point **figures = new point*[W];//массив фигур
 
for (int j = 0; j < W; j++)
 
figures[j] = new point[N];
 
  
int i = 0, // номер фигуры
+
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вниз
k = 0; //номер комбинации
+
    {
while (true)
+
        if(Board[a+i][b+i])
{
+
            return false;
if (rest(figures[k%W][i], t) < N - i) // если оставшиеся фигуры не помещаются на доске
+
    }
{
+
 
if (i == 0) // если все комбинации закончились
+
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вниз
{
+
    {
// вывод оставшихся досок
+
        if(Board[a+i][b-i])
if (k % W)
+
            return false;
print(figures, k % W, N, t);
+
    }
cout << "Amount of combinations: " << k << endl;
 
break;
 
}
 
// переходим к предыдущей фигуре и помечаем клетку пустой
 
set(figures[k%W][--i], t, NONE);
 
// сдвигаем фигуру на шаг вперёд
 
++figures[k%W][i];
 
}
 
else if (!empty(figures[k%W][i], t, i)) // если фигуры помещаются, но текущая клетка под ударом
 
// сдвигаем текущую фигуру на шаг вперёд
 
++figures[k%W][i];
 
else if (i == N - 1) // если ставим последнюю фигуру
 
{
 
// если текущая доска - последняя на строке экрана, выводим W досок
 
if ((k + 1) % W == 0)
 
print(figures, W, N, t);
 
// копирование комбинаций фигур на следующую доску
 
for (int j = 0; j < N; j++)
 
figures[(k+1)%W][j] = figures[k%W][j];
 
// переход к следующей доске
 
k++;
 
//сдвигаем текущую фигуру на шаг вперёд
 
++figures[k%W][i];
 
}
 
else // если ставим не последнюю фигуру
 
{
 
// помечаем текущую клетку номером i
 
set(figures[k%W][i], t, i);
 
//ставим следующую фигуру на клетку после текущей
 
figures[k%W][i+1] = figures[k%W][i].next();
 
// переходим к следующей фигуре
 
i++;
 
}
 
}
 
  
//освобождение памяти
+
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вверх
for (int j = 0; j < W; j++)
+
    {
delete[] figures[j];
+
        if(Board[a-i][b+i])
delete[] figures;
+
            return false;
if (desk)
+
    }
{
+
 
for (int j = 0; j < M; j++)
+
    return true; ///если в ходе проверки ферзей и угроз не обнаружилось, в данную клетку можно поставить фигуру
delete[] desk[j];
+
}
delete[] desk;
+
 
}
+
void setQueen(int a, int count) ///функция расстановки ферзей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
if (colons)
+
{
{
+
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
delete[] colons;
+
    {
delete[] rows;
+
        if(tryQueen(a, b)) ///проверка данной клетки на возможность установки фигуры
}
+
        {
if (diag_1)
+
            Board[a][b] = 1; ///установка ферзя в первую клетку поля, присваивание ей значения 1 (true)
{
+
 
delete[] diag_1;
+
            for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
delete[] diag_2;
+
                setQueen(i,count+1);
}
+
 
 +
            if(count+1 == N) /// если нужное количество фигур поставлено, то
 +
                showBoard("Q"); /// вызов функции вывода шахматной доски на экран
 +
 
 +
            Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
        }
 +
    }
 
}
 
}
  
 +
///Функции проверки и установки для ладьи
  
int main()
+
bool tryRook(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
{
system("color 70"); // Установка серого фона и чёрного текста
+
    for (int i = 0; i < M; ++i) ///проверка единственности ладьи в строке
while (true)
+
    {
{
+
        if(Board[a][i])
cout << "Choose the mode:\n1 - all possible variants of figures' placement\n2 - maximum number of figures which can be placed on the desk\nq - quit\n\n";
+
            return false;
char c;
+
    }
cin >> c;
+
 
cin.ignore(100, '\n');
+
    for(int i = 0; i < M; ++i) ///проверка единственности ладьи в столбце
switch (c)
+
    {
{
+
        if(Board[i][b])
case '1':
+
            return false;
case '2':
+
    }
cout << "Enter the desk size please. (The number must be even and not more than 37.)\n";
+
 
cin >> M;
+
    return true; ///если в ходе проверки ладей и угроз не обнаружилось, в данную клетку можно поставить фигуру
while (!cin || M % 2 != 0 || M > 37 || M <= 0)
+
}
{
+
 
cout << "Error: wrong desk size. Try again please.\n";
+
void setRook(int a, int count) ///функция расстановки ладей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
cin.clear();
+
{
cin.ignore(100, '\n');
+
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
cin >> M;
+
    {
}
+
        if(tryRook(a, b)) ///проверка данной клетки на возможность установки фигуры
cin.ignore(100, '\n');
+
        {
cout << "Choose a figure, please.\n p - peshka, k - kon, l - ladya, s - slon, Q - Queen, K - King\n";
+
            Board[a][b] = 1; ///установка ладьи в первую клетку, присваивание ей значения 1 (true)
char f;
+
 
cin >> f;
+
            for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
cin.ignore(100, '\n');
+
                setRook(i,count+1);
type t;
+
 
int i;
+
            if(count+1 == N) /// если нужное количество фигур поставлено, то
do
+
                showBoard("R"); /// вызов функции вывода шахматной доски на экран
{
+
 
for (i = 0; i < 6; i++)
+
            Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
{
+
        }
if (symbols[i] == f)
+
    }
{
+
}
t = type(i);
+
 
break;
+
///Функции проверки и установки для слона
}
+
 
}
+
bool tryEl(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
if (i == 6)
+
{
{
+
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вверх
cout << "Enter the right letter, you've chosen the wrong one.\n";
+
    {
cin >> f;
+
        if(Board[a-i][b-i])
cin.ignore(100, '\n');
+
            return false;
}
+
    }
} while (i == 6);
+
 
if (c == '1')
+
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вниз
{
+
    {
cout << "Enter the number of figures please.\n";
+
        if(Board[a+i][b+i])
int N;
+
            return false;
cin >> N;
+
    }
while (!cin || N <= 0)
 
{
 
cout << "Error: wrong argument. Try again please.\n";
 
cin.clear();
 
cin.ignore(100, '\n');
 
cin >> N;
 
}
 
cin.ignore(100, '\n');
 
all_placements(N, t);
 
}
 
else
 
{
 
cout << "The maximal number of figures is ";
 
switch (t)
 
{
 
case peshka:
 
cout << M*M/2; break;
 
case king:
 
cout << M*M/4; break;
 
case kon:
 
cout << (M == 2 ? 4 : M*M/2); break;
 
case ladya:
 
cout << M; break;
 
case slon:
 
cout << 2*M - 2; break;
 
case queen:
 
cout << (M == 2 ? 1 : M);
 
}
 
cout << ".\n";
 
}
 
break;
 
case 'q':
 
cout << endl;
 
return 0;
 
default:
 
cout << "You've chosen the wrong command, try again please.\n";
 
}
 
cout << endl << endl;
 
}
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Лосева Татьяна]]'''
+
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вниз
 +
    {
 +
        if(Board[a+i][b-i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вверх
 +
    {
 +
        if(Board[a-i][b+i])
 +
            return false;
 +
    }
  
'''Краткое описание алгоритма :'''
+
    return true; ///если в ходе проверки слонов и угроз не обнаружилось, в данную клетку можно поставить фигуру
Доска представлена в виде динамического массива;Для каждой фигуры написана отдельная функция проверки на возможность установки фигуры,проверяющая, находится ли эта фигура под ударом других.
+
}
После выбора типа фигуры,используется  рекурсивная функция,которая проверяет возможные  расстановки через данную функцию проверки ,для данного типа фигуры.
+
void setEl(int dia, int count) ///функция расстановки слонов; line - очередная строка, count - счетчик количества фигур, которое необходимо расставить
Для поиска максимального значения мы проверяем расстановку начиная с 0 количество фигур ,каждый раз увеличивая на 1,если количество расстановок станет равно нулю,то предыдущее количество фигур было максимальным.
+
{
 +
    ///dia - очередная диагональ, которую нужно исследовать на наличие фигуры и угрозы
 +
    int a, b; ///клетка, с которой начинается расстановка, a- очередная строка, b- очередной столбец
  
'''Инструкция''' : Пользователя попросят ввести размер доски,затем выбрать один из вариантов работы программы:1.поиск возможных расстановок для M фигур или 2.поиск максимального количества расстановок для данного поля,затем попросят выбрать тип фигуры и в первом случае количество фигур.При выводе на экран выводится номер расстановки и доска,на доске F- обозначены занятые клетки,0-пуская клетка.
+
    if (dia < M) ///условие, что клеткa данной диагонали лежат на доске
Для 2 пункта выводится лишь число: максимальное количество фигур,которое можно расставить.
+
    {
 +
        a = dia; ///начало отсчёта диагоналей, цикл движется по строке
 +
        b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
 +
    }
 +
  else ///если клеткa данной диагонали выходит за размер доски (когда цикл по строке доберется до конца
 +
    {
 +
        a = M-1; ///самая последняя диагональ
 +
        b =(dia % M)+1; ///соответственно расчёт переменной для столбца этой диагонали
 +
    }
  
Скачать можно : [http://tm.spbstu.ru/Файл:Шахматы_Лосева.rar тут]
+
    for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам снизу слева вправо вверх
 +
    {
 +
        int line = a-i; ///строковая координата данной клетки диагонали
 +
        int column = b+i; ///столбцовая координата данной клетки диагонали
  
 +
        if(tryEl(line, column))/// проверка на единственность слона по диагоналям
 +
        {
 +
            Board[line][column]=1; ///установка слона в первую клетку, присваивание ей значения 1 (true)
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
            for(int i = dia + 1; i<2*M-1; ++i) ///расстановка указанного пользователем количества фигур
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
                setEl(i,count+1);
#include<iostream>
 
using namespace std;
 
int N;//размер доски NxN
 
int **a;
 
int *ax;
 
int *by;
 
int l = 0;//L-номер пункта в меню
 
int M;//количество фигур
 
bool isPrint = false;//переменная для вывода на экран,когда требуется,для удобства обозначим в начале false
 
  
 +
            if(count+1 == N) /// если нужное количество фигур поставлено, то
 +
                showBoard("E"); /// вызов функции вывода шахматной доски на экран
  
void print()//функция вывода на экран
+
            Board[line][column]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
{
+
        }
for (int i = N - 1; i >= 0; --i)
+
    }
{
 
for (int j = 0; j < N; ++j)
 
{
 
cout << ((a[j][i]) ? "F " : "0 ");//если (a[j][i]) истина,то есть клетка занята,ставим F,в другом случае,т.е.свободна,ставим 0
 
}
 
cout << '\n';
 
}
 
cout << '\n';
 
 
 
 
}
 
}
bool Lad(int x, int y)//Ладья
 
{
 
for (int i = 0; i < N; ++i)
 
{
 
if (a[i][y] == 1 )//проверяем горизонталь:если клетка занята
 
{
 
return false;//возвращаем false
 
}
 
if (a[x][i] == 1)//проверяем вертикаль : если хотя бы одна клетка занята,то
 
{
 
return false;//возврашаем false
 
}
 
}
 
return true;//ничего выше не выполняется,значит возвращаем правду:вертикаль и горизонталь свободна
 
  
}
+
///Функции проверки и установки для коня
  
bool Kon(int x, int y)//Коняша
+
bool tryHorse(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
{
int i[8] = {-2, -2, -1, -1, 1, 1, 2, 2};//координаты клеток,на которые может ходить конь,относительно текущей (8 вариантов)
+
    ///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 5х5 вокруг установленной фигуры
int j[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
 
 
for (int k = 0; k < 8; k++)//8 вариантов хода
 
 
{
 
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//проверка выхода за границы массива
 
{
 
if (a[x + i[k]][y + j[k]] != 0)//клетка занята
 
{
 
return false;//возвращем false
 
}
 
}
 
}
 
return true;////ничего выше не выполняется,значит возвращаем правду:все варианты ходов  свободны и конь никого не перебивает,тогда можно занять клетку
 
  
}
+
    if ((a-1) >=0 && (b-2)>=0 && Board[a-1][b-2])
 +
        return false;
  
 +
    if ((a-1)>=0 && (b+2) < M && Board[a-1][b+2])
 +
        return false;
  
 +
    if ((a+1) < M && (b-2) >=0 && Board[a+1][b-2])
 +
        return false;
  
 +
    if ((a+1) < M && (b+2) < M && Board[a+1][b+2])
 +
        return false;
  
bool Korol(int x, int y)//Король
+
    if ((a-2) >=0 && (b-1) >=0 && Board[a-2][b-1])
{
+
        return false;
  
int i[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };//координаты клеток,на которые может ходить король,относительно текущей
+
    if ((a-2) >=0 && (b+1) < M && Board[a-2][b+1])
    int j[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
+
        return false;
  
for(int k = 0; k < 8; k++)//8 вариантов хода
+
    if ((a+2) < M && (b-1) >= 0 && Board[a+2][b-1])
{
+
        return false;
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//прроверяем не выходит ли фигура за границы массива
 
{
 
if (a[x + i[k]][y + j[k]] != 0)//если какой нибудь из вариантов хода занят
 
{
 
return false;//то false
 
}
 
}
 
}
 
return true;//свободно,можно занимать
 
}
 
  
bool Slon(int x, int y)
+
    if ((a+2) < M && (b+1) < M && Board[a+2][b+1])
{
+
        return false;
int p1 = y - x;//номер диагонали слева направо
+
 
int p2 = y + x;//номер диагонали с права налево
+
    return true; ///если в ходе проверки коней и угроз не обнаружилось, в данную клетку можно поставить фигуру
for (int i = 0; i < N; i++)//проверяем левую диагональ
 
{
 
if (i + p1 >= 0 && i + p1 < N)//проверка на выход за границы массива
 
{
 
if (a[i][i + p1] == 1) //проверяем диагональ
 
{
 
return false;//диагональ занята
 
}
 
}
 
if (-i + p2 >= 0 && -i + p2 < N)//вторая диагональ
 
{
 
if (a[i][-i + p2] == 1)  
 
{
 
return false;//вторая диагональ занята
 
}
 
}
 
}
 
return true;//обе диагонали свободны,ура!
 
 
}
 
}
  
bool Check(int x, int y)//Ферзь=Ладья+Слон
+
void setHorse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
 
{
 
{
int p1 = y - x;//диагональ 1
+
    if(count==N) /// если нужное количество фигур поставлено, то
int p2 = y + x;//диагональ 2
+
    {
for (int i = 0; i < N; ++i)
+
        showBoard("H"); /// вызов функции вывода шахматной доски на экран
{
+
    }
if (a[i][y] == 1 )//проверяем горизонталь
+
 
{
+
    if (a == M) ///условие необходимо; прогоняет алгоритм по всем строкам
return false;//занято
+
        return;
}
+
 
if (a[x][i] == 1)//проверяем вертикаль
+
    for (int j=b; j<M; ++j) ///установка коней в первой строке
{
+
    {
return false;//занято
+
        if(tryHorse(a, j)) ///проверка данной клетки на возможность установки фигуры
}
+
        {
+
            Board[a][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
if (i + p1 >= 0 && i + p1 < N)//выход за границы массива
+
            int line = a, b = j+1; ///смещение в строке на одну позицию вправо, переобозначение строки на line
{
 
if (a[i][i + p1] == 1) //проверяем 1 диагональ
 
{
 
return false;//занято
 
}
 
}
 
if (-i + p2 >= 0 && -i + p2 < N)//выход за границы массива
 
{
 
if (a[i][-i + p2] == 1)//проверяем 2ую диагональ
 
{
 
return false;//занято
 
}
 
}
 
}
 
return true;//свободно!
 
}
 
  
int  menu1()
+
            if (b == M) ///если данный столбец - самый крайний
{
+
            {
cout << "Type of figure:" << endl << "1 - Ferz" << endl << "2 - Ladya" << endl << "3 - Slon" << endl << "4 - Kon" << endl << "5 - Korol" << endl;
+
                b = 0; ///обнуление переменной, чтобы использовать ее при заполнении следующей строки
cin >> l;
+
                line++;    ///то переход на следующую строку и дальнейшее ее заполнение
return l;
+
            }
}
+
            setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
 +
            Board[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
        }
 +
    }
  
int num = 0;//номер расстановки
+
    for(int i=a+1; i<M; ++i) ///дальнейшее заполнение оставшихся строк
//пробует найти результаты решений.
+
    {
 
+
        for (int j=0; j<M; ++j)
void Func(int d,int K) //d-глубина рекурсии;K-сколько фигур нужно расставить
+
        {
{
+
            if(tryHorse(i, j)) ///проверка данной клетки на возможность установки фигуры
if (d == K)//когда расставили нужное количество
+
            {
{
+
                Board[i][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
if (isPrint)//если true,то печатаем(в случае с MAX количеством доску печатать не нужно)
+
                int line = i, b = j+1; ///смещение в строке на одну позицию вправо
{
 
cout << "Result: " << num + 1 << '\n';//выводим нормер расстановки
 
print();//печатаем доску
 
}
 
num++;//номер расстановки увеличивается
 
return;
 
}
 
  
int minX = d != 0 ? ax[d - 1] : 0;//исходя из того куда быда поставлена предыдущая фигура
+
                if (b == M) ///если данный столбец - самый крайний
//,накладываются ограничения для выбора места новой,чтобы избежать поторений
+
                {
int minY = d != 0 ? by[d - 1] + 1 : 0;
+
                    b = 0;
 +
                    line++;  ///то переход на следующую строку и дальнейшее ее заполнение
 +
                }
 +
                setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
 +
                Board[i][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
            }
 +
        }
 +
    }
 +
}
  
 +
///для короля
  
bool isPossible = false;//Проверяет,возможно ли занять клетку
+
bool tryKing(int a, int b) /// проверка на возможность поставить фигуру в квадрате 3х3, a- очередная строка, b- очередной столбец
for (int i = minX; i < N; ++i)
+
{
{
+
///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 3х3 вокруг установленной фигуры
  
for (int j = (i != minX) ? 0 : minY; j < N; ++j)
+
    for(int i = a-1; i <= a+1; ++i) ///проверка по строкам
{
+
    {
switch (l)//l- номер пункта в меню с фигурами
+
        for(int j = b-1; j <= b+1; ++j) ///проверка по столбцам
{
+
        {
case 1://ферзь
+
            if (a>=0 && a < M && b>=0 && b < M && Board[a][b]) ///условие наличия клетки в пределах доски
isPossible = Check(i, j);
+
                return false;
break;
+
 
case 2://Ладья
+
            if ((a+1) < M && (b-1) >=0 && Board[a+1][b-1])
isPossible = Lad(i, j);
+
                return false;
break;
 
case 3://Слон
 
 
isPossible = Slon(i, j);
 
break;
 
case 4://Конь
 
isPossible = Kon(i, j);
 
break;
 
case 5://Король
 
isPossible = Korol(i, j);
 
break;
 
}
 
if (isPossible)//если клетку занять возмоно(функция вернула true)
 
{
 
  a[i][j] = 1;//занимаем клетку
 
ax[d] = i;//запоминаем куда была поставлена фигура
 
by[d] = j;//запоминаем куда была поставлена фигура
 
Func(d + 1, K);//вызываем рекурсивно
 
a[i][j] = 0;
 
}
 
}
 
}
 
  
return;
+
            if ((a+1) < M && Board[a+1][b])
}
+
                return false;
  
int main()
+
            if ((a+1) < M && (b+1) < M && Board[a+1][b+1])
{
+
                return false;
  
cout << "Enter size: ";//нужно ввести размер доски
+
            if ((b+1) < M && Board[a][b+1])
cin >> N;//считываем размер доски
+
                return false;
  
a = new int*[N];//создаём двумерный массив,т.е.нашу доску
+
            if ((a-1)>=0 && (b+1) < M && Board[a-1][b+1])
for (int i = 0; i < N; i++)
+
                return false;
{
 
a[i] = new int[N];
 
for (int j = 0; j < N; j++)
 
a[i][j] = 0;//заполняем нулями
 
}
 
 
ax = new int[N];//массивы для сохранения координаты каждой фигуры,чтобы избежать повторений
 
by = new int[N];
 
  
int d;//пункт в меню
+
            if ((a-1) >=0 && Board[a-1][b])
cout<<"1 - Rasstanovka figur"<<endl<<"2 - MAX znachenie"<<endl;//два варианта работы программы
+
                return false;
cin>>d;//считываем выбор пользователя
 
if(d==1)//если выбирает расстановку
 
 
menu1();//то спрашиваем для какой фигуры
 
cout<<"How many figures?"<<endl;//и как много будет фигур
 
    cin>>M;//считываем количество фигур
 
isPrint = true;//в этом случае будем выводить на экран
 
Func(0,M);//запуск рекурсивной функции
 
}
 
  
if (d == 2)//случай подсчёта максимального значения
+
            if ((a-1) >=0 && (b-1)>=0 && Board[a-1][b-1])
{
+
                return false;
int n = 0;//изачально max=0
 
menu1();//выбираем фигуру
 
 
do//начало цикла
 
{
 
num = 0;
 
Func(0, ++n);//запускаем каждый раз увеличивая значение фигур и считаем количество расстановок
 
} while (num != 0);//количество вариантов не должно быть равно нулю
 
cout <<"MAX ="<< n - 1 << endl;//если количество вариантов = 0,то выходим из цикла и предыдущее значение  максимальное
 
}
 
 
  
int z;
+
            if ((b-1) >= 0 && Board[a][b-1])
cin >> z;
+
                return false;
 +
        }
 +
    }
  
return 0;
+
    return true; ///если в ходе проверки королей и угроз не обнаружилось, в данную клетку можно поставить фигуру
 
}
 
}
</syntaxhighlight>
 
</div>
 
  
'''[[Сергей Ляжков]]'''
+
void setKing (int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count -  счетчик количества фигур, которое необходимо расставить
Инструкция:
+
{
Вводите необходимые данные(кол-во строк, столбцов, фигуры, тип расстановки) согласно последовательности выполнения программы
+
    for (int j=b; j<M; ++j) ///установка королей в первой строке
Краткое описание алгоритма:
+
    {
1)Выделяет память под доску(динамическая матрица)
+
        if(tryKing(a, j)) ///проверка данной клетки на возможность установки фигуры
2)Устанавливает каждую следующую фигуру на n-е свободное место которое он нашел после последней установленной фигуры, где n изменяется от 1 до бесконечности(установка заканчивается тогда, когда программа не может установить очередную фигуру).
+
        {
3)Счетчик количества фигур, которые необходимо установить, уменьшается на 1 после каждой установки.
+
            Board[a][j]=1; ///проверка данной клетки на возможность установки фигуры
4)После того, как фигура установлена, программа рекурсивно вызывает функцию установки очередной фигуры(возвращается в пункт 2)
+
            setKing(count+1,a,j); ///расстановка фигур в первой строке
5)В рекурсивную функцию отправляется только копия доски. Таким образом, возвращаясь из рекурсии, мы получаем доску без последующих установленных фигур. Когда счетчик фигур, которые необходимо установить, уменьшается до нуля, данное поле сохраняется в списке.
+
            Board[a][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
6)Вывод списка.
+
        }
Скачать можно [http://tm.spbstu.ru/File:Шахматы.zip тут]
+
    }
  
<br>'''[[Нарядчиков Александр]]'''<br>
+
    for(int i=a+1; i<M; ++i) ///установка фигур в оставшуюся часть шахматной доски по строкам
'''Инструкция:''' Запустить программу, следовать указаниям, полученным в меню программы.<br>
+
    {
'''Описание программы:''' Шахматное поле представлено в виде двумерного массив N на M, значения N и M пользователь вводит самостоятельно, память выделяется динамически. Также пользователь выбирает тип и количество фигур на поле. В меню можно выбрать между поиском максимально возможного числа фигур на столе и поиском всех расстановок с дальнейшей записью полей в файл.<br>
+
        for (int j=0; j<M; ++j)
'''Описание алгоритма:''' При поиске всех расстановок происходит установка выбранной фигуры в свободную клетку, далее происходит маркирование тех клеток, в которые уже невозможно поставить фигуру данного типа, затем процесс происходит снова(рекурсия) пока на поле не окажется выбранное пользователем число фигур. Под конец данное поле записывается в файл и происходит поиск других возможных расстановок данного типа. В конце получаем файл со всеми вариантами расстановок и их количеством. При поиске наибольшего числа фигур на доске программа ищет расстановку для одной фигуры, затем для двух, если это возможно и т.д. С каждым разом происходит увеличение счетчика количества фигур на поле, тем самым в конце данного алгоритма мы получаем максимально возможное число данного типа фигур на доске данного размера.<br>
+
        {
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
            if(tryKing(i, j)) ///проверка данной клетки на возможность установки фигуры
"'''T04CHESS.CPP'''"
+
            {
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
                Board[i][j]=1; ///проверка данной клетки на возможность установки фигуры
/* FILENAME: T04CHESS.CPP
+
                setKing(count+1,i,j); ///расстановка фигур
* LAST UPDATE: 17.01.2016
+
                Board[i][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
*/
+
            }
 +
        }
 +
    }
  
#include "CHESS.h"
+
    if(count==N) /// если нужное количество фигур поставлено, то
 +
    {
 +
        showBoard("K");/// вызов функции вывода шахматной доски на экран
 +
        return;
 +
    }
 +
}
  
/* Main function */
+
int main()
int main( void )
 
 
{
 
{
// Переменная, отвечающая за выход из меню
+
    char s; ///переменная, будет использована в цикле
int IsReady = 1;
+
    do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
// Количество строк поля; количество столбцов поля
+
    {
int N, M;
+
        do ///цикл для считывания введенного пользователем размера доски
// Если идет поиск всех расстановок - 0; если идет поиск максимального числа фигур на доске - 1
+
        {
int IsCount;
+
            cout << "Input the size of the board: " << endl; ///ввод размера доски
// Количество фигур на поле
+
            cin >> M;
int Number;
 
// Тип фигуры; количество разных расстановок; максимальное число фигур на доске
 
int tmp, count, max_value = 1;
 
// Создание указателя на тип FILE
 
FILE *F;
 
  
// Консольное меню
+
            if ( (M%2) == 1) ///цикл, работающий только в том случае, если пользователь введет нечетное число
while (IsReady == 1)
+
            {
{
+
                cout << '\n' << "The number must be even, so try to input the size again" << '\n' << endl;
cout << "Input figure type:\n1 - castle\n2 - bishop\n3 - knight\n4 - queen\n5 - king\n";
+
            }
cin >> tmp;
 
  
cout << "Input number of rows on the field:\n";
+
        }
cin >> N;
+
        while (M%2 !=0); ///пока пользователь не введет допуcтимое число, цикл не прерывается
  
cout << "Input number of columns on the field:\n";
+
        Board = new int*[M];  ///создание двумерного массива для отображения шахматной доски
cin >> M;
+
        for (int i = 0; i<M; i++)
 +
            Board[i] = new int[M]; ///создание первую строку доски
 +
        for (int i = 0; i<M; i++)
 +
            for (int j = 0; j<M; j++)
 +
                Board[i][j] = 0;  ///зануление массива
  
// Поле шахмат
+
        int V; ///пользователь выбирает один из двух вариантов работы программы
chess desk(N, M);
+
        cout << '\n' << "Input your choice: 1=placing of figures, 2=for max amount of figures" << endl;
 +
        cin >> V;
  
// Обнуление поля
+
        if (V==1) ///цикл, расставляющий фигуры по введенным пользователем данным
desk.Clear();
+
        {
 +
            char k; ///переменная, будет использована в цикле
 +
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
 +
            {
 +
                int T; ///пользователь выбирает фигуру
 +
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
 +
                cin >> T;
  
cout << "Input in what mode do you want to work:\n0 - Searching for all fields variants\n1 - Searching for the maximum number of chessmen\n";
+
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
cin >> IsCount;
+
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
 
+
                {
// Если идет поиск всех расстановок
+
                    maximum=M;
if (IsCount == 0)
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
{
+
                }
cout << "Input number of chessmen on the field:\n";
+
                if (T==2) ///максимальное количество фигур на заданной доске для короля
cin >> Number;
+
                {
 
+
                    maximum=0.25*M*M;
// Создание файла и его открытие
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
fopen_s(&F, "chess.txt", "wt");
+
                }
if ((type)(tmp + 1) == 2)
+
                if (T==3) ///максимальное количество фигур на заданной доске для коня
fputs("Castles' fields:\n", F);
+
                {
else if ((type)(tmp + 1) == 3)
+
                    maximum=0.5*M*M;
fputs("Bishops' fields:\n", F);
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
else if ((type)(tmp + 1) == 4)
+
                }
fputs("Knights' fields:\n", F);
+
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
else if ((type)(tmp + 1) == 5)
+
                {
fputs("Quenns' fields:\n", F);
+
                    maximum=M;
else if ((type)(tmp + 1) == 6)
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
fputs("Kings' fields:\n", F);
+
                }
else
+
                if (T==5) ///максимальное количество фигур на заданной доске для слона
{
+
                {
fputs("Error\n", F);
+
                    maximum=2*M-2;
return 0;
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
}
+
                }
// Закрытие файла
 
fclose(F);
 
  
// Количество разных расстановок
+
                do ///цикл, считывающий количество фигур, заданное пользователем
count = desk.FillField(IsCount, (type)(tmp + 1), 0, 0, Number, 0);
+
                {
 +
                    cout << "Input the amount of figures, it must be less than max amount or equals that" << endl;
 +
                    cin >> N;
 +
                }
 +
                while (N>maximum);  ///пока пользователь не введет допуcтимое число, цикл не прерывается
  
// Открытие файла в режиме повторной записи
+
                cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
fopen_s(&F, "chess.txt", "at");
 
fprintf(F, "\nNumber of fields: %i", count);
 
// Закрытие файла
 
fclose(F);
 
  
cout << "Done!\nCheck 'chess.txt' to see results\n";
+
                if (T==1) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для ферзя
}
+
                {
 +
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                    for (int i=0; i <M; ++i)
 +
                        setQueen(i,0);
 +
                }
 +
                if (T==2) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для короля
 +
                {
 +
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                    setKing(0,0,0);
 +
                }
 +
                if (T==3) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для коня
 +
                {
 +
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                    setHorse(0,0,0);
 +
                }
 +
                if (T==4) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для ладьи
 +
                {
 +
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                    for (int i=0; i <M; ++i)
 +
                        setRook(i,0);
 +
                }
 +
                if (T==5) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для слона
 +
                {
 +
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                    for(int i = 0; i<2*M-1; ++i)
 +
                        setEl(i,0);
 +
                }
  
// Если идет поиск максимального числа фигур на доске
+
                cout << '\n' << "If you want continue placing figures, input +, if not, input -" << endl;
else if (IsCount == 1)
+
                cin >> k;
{
+
            }
while (desk.FillField(IsCount, (type)(tmp + 1), 0, 0, max_value, 0))
+
            while (k != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
max_value++;
+
        }
cout << "The maximum number of chessmen on the board is " << (max_value - 1) << endl;
 
max_value = 1;
 
}
 
  
// Если было введено некорректное значение для IsCount
+
        else if (V==2) ///цикл, вычисляющий максимальное количество фигур по введенным пользователем данным
else
+
        {
cout << "Error\n";
+
            char z; ///переменная, будет использована в цикле
 
+
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
// Продолжение работы с программой
+
            {
cout << "Press '1' if you want to continue\nPress another number if you want to exit\n";
+
                int T; ///переменная для выбора фигуры пользователем
cin >> IsReady;
+
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
 +
                cin >> T;
 +
                char d;  ///переменная, будет использована в циклах
 +
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
 +
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
 +
                {
 +
                    maximum=M; ///формула расчёта максимального количества фигур для заданной доски
 +
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 +
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
 +
                    cin >> d;
 +
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 +
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 +
                    {
 +
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                        for (int i=0; i < M; ++i)
 +
                            setQueen(i,0);
 +
                    }
  
if (IsReady == 1)
+
                }
continue;
+
                if (T==2) ///максимальное количество фигур на заданной доске для короля
else
+
                {
exit(0);
+
                    maximum=0.25*M*M; ///формула расчёта максимального количества фигур для заданной доски
}
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
+
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
return 0;
+
                    cin >> d;
} // End of 'main' function
+
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 
+
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
// END OF 'T04CHESS.CPP' FILE
+
                    {
</syntaxhighlight>
+
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
"'''CHESS.CPP'''"
+
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
                        setKing(0,0,0);
/* FILENAME: CHESS.CPP
+
                    }
* LAST UPDATE: 17.01.2016
+
                }
*/
+
                if (T==3) ///максимальное количество фигур на заданной доске для коня
 
+
                {
#include "CHESS.H"
+
                    maximum=0.5*M*M; ///формула расчёта максимального количества фигур для заданной доски
 
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
// Количество расстановок
+
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
int Result_count = 0;
+
                    cin >> d;
 
+
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
/* Clear field function */
+
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
// Обнуление поля
+
                    {
void chess::Clear( void )
+
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
{
+
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
// Все клетки свободны
+
                        setHorse(0,0,0);
for (int i = 0; i < N; i++)
+
                    }
for (int j = 0; j < M; j++)
+
                }
Field[i][j] = Free;
+
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
} // End of 'Clear' function
+
                {
 
+
                    maximum=M; ///формула расчёта максимального количества фигур для заданной доски
/* Check if the cell is available that function */
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
// Проверка, свободна и существует ли данная клетка
+
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
int chess::IsAvailable( int x, int y )
+
                    cin >> d;
{
+
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
if (x >= 0 && y >= 0 && x < M && y < N)
+
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
if (Field[y][x] == Free)
+
                    {
  return 1;
+
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
+
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
return 0;
+
                        for (int i=0; i <M; ++i)
} // End of 'IsAvailable' function
+
                            setRook(i,0);
 +
                    }
 +
                }
 +
                if (T==5) ///максимальное количество фигур на заданной доске для слона
 +
                {
 +
                    maximum=2*M-2; ///формула расчёта максимального количества фигур для заданной доски
 +
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 +
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
 +
                    cin >> d;
 +
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 +
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 +
                    {
 +
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 +
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                        for(int i = 0; i<2*M-1; ++i)
 +
                            setEl(i,0);
 +
                    }
 +
                }
  
/* Output field in file function */
+
                cout << '\n' << "If you want continue counting, input +, if not, input -" << '\n' << endl;
// Запись одного поля в файл
+
                cin >> z;
void chess::OutputInFile( void )
+
            }
{
+
            while (z != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
// Создание указателя на тип FILE
+
        }
FILE *F;
+
        cout << '\n' << "If you want to change the size of board, input +, if not, input -" << endl;
 
+
        cin >> s;
// Открытие файла в режиме повторной записи
+
        if (s=='-')
fopen_s(&F, "chess.txt", "at");
+
        {
 +
            cout << '\n' << "The program is finished." << '\n' << endl; ///вывод на экран сообщения о завершении работы программы
 +
        }
 +
    }
 +
    while (s != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение, а также на завершение всей программы
 +
}
 +
 
 +
</syntaxhighlight>
 +
</div>
  
// Переход на следующую строку файла
 
fputc('\n', F);
 
  
// Заполнение файла текущем полем
 
for (int i = 0; i < N; ++i)
 
{
 
// '*' - свободная клетка; '#' - клетка, которая уже занята
 
for (int j = 0; j < M; ++j)
 
(Field[i][j] == Free || Field[i][j] == busy) ? fputc('*', F) : fputc('#', F);
 
// Переход на следующую строку файла
 
fputc('\n', F);
 
}
 
  
// Закрытие файла
 
fclose(F);
 
} /* End of 'OutputInFile' function */
 
  
/* Copy desks function */
 
// Копирование поля
 
void chess::Copy( chess &desk2 )
 
{
 
  for (int i = 0; i < N; i++)
 
for (int j = 0; j < M; j++)
 
desk2.Field[i][j] = Field[i][j];
 
} // End of 'Copy' function
 
  
/* Fill field function */
 
// Заполнение полей и поиск максимального числа расстановок
 
// Chessmen_num - количество фигур, которое нужно поставить; Already_stood - количество, которое уже стоит
 
int chess::FillField( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood )
 
{
 
int i, j, k, l;
 
chess desk2(N, M);
 
  
// Обнуление поля
+
'''[[Александр Сюрис]]'''
desk2.Clear();
 
  
// Пробег по всем оставшимся клеткам поля, начиная с той, на которой мы закончили предыдущую итерацию
+
Программа работает в двух режимах: поиск максимального числа фигур для заданного поля и количество возможных расстановок заданного числа фигур для заданного поля.
for (i = y; i < N; i++)
+
 
for (j = ((i == y) ? x : 0); j < M; j++)
+
'''Алгоритм:''' 
{
+
 
// Если клетка свободна
+
#Для поиска количества возможных расстановок заданного числа фигур для заданного поля – Проверяется, возможно ли поставить фигуру в данную клетку, рекурсивно перебирает для каждой клетки поля, как начальной клетки, все варианты расстановки заданного количества  фигур относительно нее и выводит на экран все расстановки, которые подходят условиям.
if (Field[i][j] == Free)
+
#Для поиска максимального числа фигур для заданного поля –  Проверяется, можно ли поставить одну фигуру, две, три и так далее, пока фигур больше поставить будет нельзя.
{
+
 
// Копируем доску
+
Скачать можно  [http://mech.spbstu.ru/File:%D0%A8%D0%B0%D1%85%D0%BC%D0%B0%D1%82%D1%8B(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%A1%D1%8E%D1%80%D0%B8%D1%81).zip  тут].
Copy(desk2);
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
// Множественный выбор типа фигуры
+
#include <vector>
switch (set)
+
#include <iostream>
{
+
#include <algorithm>
// Ладья
+
 
case castle:
+
 
for (k = 0; k < N; k++)  
+
using namespace std;
{
+
 
// Движение по столбцу
+
int n,k, o, m, l, g, maxi, a, sum=0,y, mozno=1;//mozno=1 если можно поставить n фигур
if (desk2.Field[k][j] == Free)
+
vector<vector<int> > matrix;// двухмерный вектор
  desk2.Field[k][j] = busy;  
+
 
// Движение по строке
+
bool ladia(int x, int y) {      //проверка, можно ли в эту клетку поставить ладью
if (desk2.Field[i][k] == Free)
+
    for(int i = 0; i<n; i++)
  desk2.Field[i][k] = busy;  
+
        if(matrix[x][i] == 1)
}
+
            return false;
break;
+
    for(int j=0; j<n; j++)
// Слон
+
        if(matrix[j][y]==1)
case bishop:
+
            return false;
// Выбор и поиск наибольшей существующей на поле диагонали
+
    return true;
for (k = 1 - (N < M ? N : M); k < (N < M ? N : M); k++)
+
}
{
+
 
// Проход из левого верхнего угла до правого нижнего
+
bool slon(int x, int y) {   //    --//-- слона
if (IsAvailable(j + k, i + k))
+
 
desk2.Field[i + k][j + k] = busy;
+
  for (int i=x, j=y;i<n && j>=0; i++, j--)
// Проход из левого нижнего до правого верхнего
+
      if(matrix[i][j] == 1)
if (IsAvailable(j + k, i - k))
+
            return false;
desk2.Field[i - k][j + k] = busy;
+
  for (int i=x, j=y;i>=0 && j>=0; i--, j--)
}
+
      if(matrix[i][j] == 1)
break;
+
            return false;
// Конь
+
  for (int i=x, j=y;i>=0 && j<n; i--, j++)
case knight:
+
      if(matrix[i][j] == 1)
// Ходы коня, k - приращение по X, l - по Y
+
            return false;
k = -2, l = 1;
+
  for (int i=x, j=y;i<n && j<n; i++, j++)
// Проверка возможности хода в данную клетку
+
      if(matrix[i][j] == 1)
if (IsAvailable(j + k, i + l))
+
            return false;
desk2.Field[i + l][j + k] = busy;
+
 
+
    return true;
k = -2, l = -1;
+
 
// Проверка возможности хода в данную клетку
+
}
if (IsAvailable(j + k, i + l))
+
 
desk2.Field[i + l][j + k] = busy;
+
bool fruz(int x, int y){      //   --//-- ферзя
+
    if(slon(x,y) && ladia(x,y))
k = -1, l = 2;  
+
        return true;
// Проверка возможности хода в данную клетку
+
 
if (IsAvailable(j + k, i + l))
+
    return false;
desk2.Field[i + l][j + k] = busy;
+
 
+
 
k = -1, l = -2;  
+
}
// Проверка возможности хода в данную клетку
+
 
if (IsAvailable(j + k, i + l))
+
bool kon(int x, int y) {  // --//-- коня
desk2.Field[i + l][j + k] = busy;
+
 
+
  if (x-1>=0 && y-2>=0 && matrix[x-1][y-2]==1)
k = 1, l = 2;  
+
        return false;
// Проверка возможности хода в данную клетку
+
  if (y-2>=0 && x+1<n && matrix[x+1][y-2]==1)
if (IsAvailable(j + k, i + l))
+
        return false;
desk2.Field[i + l][j + k] = busy;
+
  if (x-2>=0 && y-1>=0 && matrix[x-2][y-1]==1)
+
        return false;
k = 1, l = -2;  
+
  if (x+2<n && y-1>=0 && matrix[x+2][y-1]==1)
// Проверка возможности хода в данную клетку
+
        return false;
if (IsAvailable(j + k, i + l))
+
  if (x-2>=0 && y+1<n && matrix[x-2][y+1]==1)
desk2.Field[i + l][j + k] = busy;
+
        return false;
+
  if (x+2<n && y+1<n && matrix[x+2][y+1]==1)
k = 2, l = 1;  
+
        return false;
// Проверка возможности хода в данную клетку
+
  if (x-1>=0 && y+2<n && matrix[x-1][y+2]==1)
if (IsAvailable(j + k, i + l))
+
        return false;
desk2.Field[i + l][j + k] = busy;
+
  if (x+1<n && y+2<n && matrix[x+1][y+2]==1)
+
        return false;
k = 2, l = -1;  
+
return true;
// Проверка возможности хода в данную клетку
+
}
if (IsAvailable(j + k, i + l))
+
 
desk2.Field[i + l][j + k] = busy;
+
bool king(int x, int y) {   // --//--  короля
break;
+
 
// Ферзь
+
    if (x-1>=0 && y-1>=0 && matrix[x-1][y-1]==1)
case queen:
+
        return false;
for (k = 0; k < N; k++)
+
    if (x-1>=0 && matrix[x-1][y]==1)
{
+
        return false;
// Движение по столбцу
+
    if (y+1<n && x-1>=0 && matrix[x-1][y+1]==1)
if (desk2.Field[k][j] == Free)
+
        return false;
desk2.Field[k][j] = busy;
+
    if (y+1<n && matrix[x][y+1]==1)
// Движение по строке
+
        return false;
if (desk2.Field[i][k] == Free)
+
    if (y+1<n && x+1>n && matrix[x+1][y+1]==1)
desk2.Field[i][k] = busy;
+
        return false;
}
+
    if (x+1<n && matrix[x+1][y]==1)
+
         return false;
// Выбор и поиск наибольшей существующей на поле диагонали
+
    if (x+1<n && y-1>=0 && matrix[x+1][y-1]==1)
for (k = 1 - (N < M ? N : M); k < (N < M ? N : M); k++)
+
        return false;
{
+
    if (y-1>=0 && matrix[x][y-1]==1)
// Проход из левого верхнего угла до правого нижнего
+
        return false;
if (IsAvailable(j + k, i + k))
+
    return true;
desk2.Field[i + k][j + k] = busy;
+
 
// Проход из левого нижнего до правого верхнего
+
}
if (IsAvailable(j + k, i - k))
+
 
desk2.Field[i - k][j + k] = busy;
+
int mass() {  // вывод доски на экран
}
 
break;
 
// Король
 
case king:
 
  // Проход по квадрату 3 на 3, построенному центром на клетке, в которой стоит король
 
for (k = -1; k < 2; k++)
 
for (l = -1; l < 2; l++)
 
if (IsAvailable(j + k, i + l))
 
desk2.Field[i + l][j + k] = busy;
 
break;
 
}
 
// Установка фигуры в данную клетку
 
desk2.Field[i][j] = set;
 
          
 
// Проверяем, что количество поставленных фигур, которое равно номеру итерации, меньше чем необходимое число фигур
 
if ((Already_stood + 1) < Chessmen_num)
 
{
 
// Если идет поиск всех расстановок, то запускаем следующий шаг
 
if (IsCount == 0)
 
desk2.FillField(IsCount, set, j, i, Chessmen_num, Already_stood + 1);
 
// Если идет поиск максимального числа фигур на доске и была найдена хотя бы одна расстоновка, то возвращаем 1
 
else if ((IsCount == 1) && desk2.FillField(IsCount, set, j, i, Chessmen_num, Already_stood + 1))
 
return 1;
 
}
 
  
// Если количество поставленных фигур равно необходимому числу фигур
+
for(int i = 0; i<n; i++)
else if ((Already_stood + 1) == Chessmen_num)
+
  {
{
 
// Если идет поиск всех расстановок, то увеличиваем количество расстоновок на одну и записываем поле в файл 
 
if (IsCount == 0)
 
{
 
Result_count++;
 
  desk2.OutputInFile();
 
}
 
// Если идет поиск максимального числа фигур на доске, значит расстановка существует, возвращаем 1
 
else if (IsCount == 1)
 
return 1;
 
  }
 
}
 
}
 
// Если идет поиск всех расстановок, то возвращаем количество расстановок
 
if (IsCount == 0)
 
  return Result_count;
 
// Если идет поиск максимального числа фигур на доске, то возвращаем 0
 
else if (IsCount == 1)
 
  return 0;
 
} // End of 'FillField' function
 
  
// END OF 'CHESS.CPP' FILE
+
    for(int j = 0; j<n; j++)
</syntaxhighlight>
+
        cout<<matrix[i][j]<<" ";
"'''CHESS.H'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: CHESS.H
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#ifndef __CHESS_H_
+
        cout<<endl;
#define __CHESS_H_
+
    }
  
#include <iostream>
+
}
#include <conio.h>
 
  
using namespace std;
+
int del() {  // очистка доски(все нули)
  
// свободен, занят, ладья, слон, конь, ферзь, король
+
for (int i=0; i<n; i++) {
enum type { Free, busy, castle, bishop, knight, queen, king };
+
 
 +
    for (int j=0; j<n; j++)
 +
        matrix[i][j]=0;
 +
}
 +
 
 +
}
  
/* Chess class */
 
class chess
 
{
 
private:
 
// Поле данных фигур
 
type **Field;
 
// Количество строк поля; количество столбцов поля
 
int N, M;
 
public:
 
/* Default constructor */
 
chess( void )
 
{
 
N = 8, M = 8;
 
 
// Выделение памяти под массив поля
 
Field = new type*[N];
 
for (int i = 0; i < N; i++)
 
Field[i] = new type[M];
 
}
 
 
/* Class constructor */
 
chess( int _N, int _M ) : N(_N), M(_M)
 
{
 
// Выделение памяти под массив поля
 
Field = new type* [N];
 
for (int i = 0; i < N; i++)
 
Field[i] = new type [M];
 
}
 
  
/* Class destructor */
 
~chess( void )
 
{
 
// Чистка памяти
 
for (int i = 0; i < N; i++)
 
delete[] Field[i];
 
delete[] Field;
 
}
 
  
/* Clear field function */
+
void vsevarintyrasstavitnfigur(int x,int y)// рекурсивный поиск всех вараинтов расстановок заданнного количества фигур (x - номер фигуры в доске, если ее растянуть в линию, y - кол-во фигур)
void Clear( void );
+
    if(y==0) {
+
        if (a==1){
/* Check if the cell is available that function */
+
            mass();
int IsAvailable( int x, int y );
+
            cout<<'\n';
+
        }
/* Output field in file function */
+
        if(a==2) {
void OutputInFile( void );
+
                mozno = 1; //mozno=1 если можно поставить n фигур
+
 
/* Copy desks function */
+
        }
void Copy( chess& desk2 );
 
 
/* Fill field function */
 
int FillField ( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood);
 
}; // end of 'chess' class
 
  
#endif /*__CHESS_H_ */
+
        return;
 +
    }
  
// END OF 'CHESS.H' FILE
+
    for(int i=x;i<n*n;i++){
</syntaxhighlight>
 
</div>
 
[http://tm.spbstu.ru/File:T04CHESS.7z Скачать архив]
 
<br>
 
  
 +
        if (o==1)
 +
        if(fruz(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
  
'''[[Рубинова Раиса]]'''
+
        if (o==2)
 +
        if(ladia(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
  
'''Основная идея программы''': программа позволяет выводить на экран всевозможные расстановки n однотипных фигур на шахматной доске размером n*n так, чтобы ни одна из фигур не била другую.
+
        if (o==3)
 +
        if(slon(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
  
Скачать можно [http://tm.spbstu.ru/File:nmk.rar тут.]
+
        if (o==4)
 +
        if(kon(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
        if (o==5)
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        if(king(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
#include <iostream>
 
#include <cstring>
 
#include <cstdlib>
 
#include <ctime>
 
  
using namespace std;
 
int R = 0; ///переменная, отвечающая за количество вариантов расстановок
 
int N; ///количество фигур для расстановки, которое задает пользователь
 
int **B; ///двумерный массив, отображающий шахматную доску
 
int M; /// размер шахматной доски
 
  
 +
        vsevarintyrasstavitnfigur(i+1, y);
 +
        matrix[i/n][i%n]=0;//удаление фигуры из прошлой клетки для проверки других вариантов
 +
        y++;
  
void showBoard() ///функция, выводящая доску на экран
 
{
 
    for(int i=0; i<M; ++i) /// строки
 
    {
 
        for(int j=0; j<M; ++j)  /// столбцы
 
            {cout << B[i][j] << " ";} ///заполнение клетки с координатами i;j
 
        cout << endl;
 
 
     }
 
     }
    cout << "Variant " << ++R << "\n\n"; ///вывод номера варианта расположения с последующим переходом на новую строку
+
 
    return;
 
 
}
 
}
  
bool checkQueen(int a, int b) /// функция, проверяющая, не бьется ли ферзь другим ферзем
+
void maxfig()//поиск максимального количества фигур
{
+
     int i=0;
     for (int i = 0; i < M; ++i) ///проверка строки
+
while(mozno==1){ //проверяет для данной доски возможность расставить 1,2... фигуры, пока не доходит до количества, которое расставить невозхможно. Тогда это количество фигур -1 - искомая величина
    {
+
        i++;
         if(B[a][i])
+
        mozno=0;
            return false;
+
         vsevarintyrasstavitnfigur(0,i);
 
     }
 
     }
 +
    setlocale(LC_ALL, "Russian");
 +
    cout<<"Максимальное количество фигур = "<<i-1<<endl;
 +
}
  
    for(int i = 0; i < M; ++i) ///проверка столбца
 
    {
 
        if(B[i][b])
 
            return false;
 
    }
 
  
     for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///по диагонали влево-вверх
+
int main() {
    {
+
setlocale(LC_ALL, "Russian");
         if(B[a-i][b-i])
+
     g=0;
             return false;
+
    cout<<"Введите размер доски:"<<endl;
    }
+
    cin >>n;
 +
        for(int i=0; i<n; i++) {
 +
            vector<int> z;
 +
            for(int j=0; j<n; j++){
 +
                    z.push_back(0);  //создание вектора z  из n нулей и добавление его к двухмерному вектору
 +
            }
 +
            matrix.push_back(z);
 +
        }
 +
 
 +
        cout<<"1 - расстановки фигур на доске n*n"<<endl<<"2 - максимум фигур на доске n*n"<<endl;
 +
          cin>>a;
 +
 
 +
         while(2>1){
 +
            cout<<" 1 - ферзь"<<endl;
 +
            cout<<" 2 - ладья"<<endl;
 +
            cout<<" 3 - слон"<<endl;
 +
            cout<<" 4 - конь"<<endl;
 +
            cout<<" 5 - король"<<endl;
 +
            cout<<" 6 - выход"<<endl;
 +
 
 +
          cout<<"Введите число от 1 до 6:"<<endl;
 +
          cin>>o;
 +
            mozno=1;
 +
             if(o==6) break;
 +
 
  
    for(int i = 1; a+i < M && b+i < M; ++i)///по диагонали вправо-вниз
 
    {
 
        if(B[a+i][b+i])
 
            return false;
 
    }
 
  
    for(int i = 1; a+i < M && b-i >= 0; ++i)///по диагонали влево-вниз
 
    {
 
        if(B[a+i][b-i])
 
            return false;
 
    }
 
  
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///по диагонали вправо-вверх
 
    {
 
        if(B[a-i][b+i])
 
            return false;
 
    }
 
  
    return true;
 
}
 
  
void Queen(int a, int count) ///функция, расстанавливающая ферзи
+
    if (o==1)   {
{
+
                cout<<"Ферзь"<<endl;
    for(int b = 0; b < M; ++b) /// расстановка по изменению номера столбца
+
 
    {
+
            if(a==1)
        if(checkQueen(a, b)) ///проверка, бьется ли данная клетка ферзем
+
                 {
        {
+
                    cin>>y;
            B[a][b] = 1; ///заполнение первой клетки
+
                    vsevarintyrasstavitnfigur(0,y);
            for(int i = a+1; i < M; ++i) ///расстановка указанного пользователем количества фигур
+
                }
                 Queen(i,count+1);
 
            if(count+1==N) /// проверка, расставили ли мы нужное количество фигур
 
                showBoard();
 
            B[a][b]=0; ///обнуление переменной
 
        }
 
    }
 
}
 
  
bool checkRook(int a, int b) /// функция, проверяющая ли данную клетку ладья
 
{
 
    for (int i = 0; i < M; ++i) ///проверка строки
 
    {
 
        if(B[a][i])
 
            return false;
 
    }
 
  
    for(int i = 0; i < M; ++i) ///проверка столбца
+
            if (a==2)
    {
+
                maxfig();
        if(B[i][b])
 
            return false;
 
    }
 
  
    return true;
+
                }
}
 
  
void Rook(int a, int count) ///функция, расстанавливающая ладьи
 
{
 
    for(int b = 0; b < M; ++b) /// расстановка по строкам с изменением номера столбца
 
    {
 
        if(checkRook(a, b)) ///проверка, бьется ли данная клетка ладьей
 
        {
 
            B[a][b] = 1; ///установка ладьи
 
            for(int i =a+1; i<M; ++i)
 
                Rook(i,count+1);
 
            if(count+1 == N) /// проверка, расставили ли мы нужное количество элементов
 
                showBoard();
 
  
            B[a][b]=0; ///обнуление переменной
 
        }
 
    }
 
}
 
  
bool checkElephant(int a, int b) /// функция, проверяющая, бьется ли данная клетка слоном
 
{
 
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка по диагонали влево-вверх
 
    {
 
        if(B[a-i][b-i])
 
            return false;
 
    }
 
  
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка по диагонали вправо-вниз
 
    {
 
        if(B[a+i][b+i])
 
            return false;
 
    }
 
  
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка по диагонали влево-вниз
 
    {
 
        if(B[a+i][b-i])
 
            return false;
 
    }
 
  
     for(int i = 1; a-i >= 0 && b+i < M; ++i) ///проверка по диагонали вправо-вверх
+
     if (o==2)   {
    {
+
                cout<<endl<<"Ладья"<<endl;
        if(B[a-i][b+i])
 
            return false;
 
    }
 
  
    return true;
+
                    if(a==1)
}
+
                    {
void Elephant(int dia, int count) ///функция, расстанавливающая слоны
 
{
 
    int a, b; /// задача клетки, соответствующекй данной диагонали
 
    if (dia < M) /// проверка диагонали
 
    {
 
        a = dia; /// номер строки - номер диагонали
 
        b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
 
    }
 
  else ///если все диагонали рассмотрены
 
    {
 
        a = M-1; /// рассматриваем самую последнюю диагональ
 
        b =(dia % M)+1; ///рассчитываем координату столбца для данной диагонали
 
    }
 
  
    for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам из нижнего левого угла в правый верхний
+
                        cin>>y;
    {
+
                        vsevarintyrasstavitnfigur(0,y);
        int line=a-i; ///координата строки (мы уменьшаем координату строки)
+
                    }
        int column=b+i; ///координата столбца  (но увеличиваем координату столбца)
 
  
        if(checkElephant(line, column))/// проверка, бьется ли слон по диагонали
+
                    if (a==2)
        {
+
                        maxfig();
            B[line][column]=1; ///установка слона
 
  
            for(int i=dia+1; i<2*M-1; ++i) ///расстановка фигур, основанная на изменении параметров (номера диагонали и количества рсставленных фигур)
+
                 }
                 Elephant(i,count+1);
 
  
            if(count+1 == N) /// проверка количества расставленных фигур
 
                showBoard();
 
  
            B[line][column]=0; ///обнуление переменной
+
    if (o==3)  {
        }
+
                cout<<endl<<"Слон"<<endl;
    }
 
}
 
  
bool checkHorse(int a, int b) /// функция, проверяющая, бьется ли данная клетка конями
+
                if(a==1)
{
+
                    {
    if ((a-1) >=0 && (b-2)>=0 && B[a-1][b-2])
+
                    cin>>y;
        return false;
+
                    vsevarintyrasstavitnfigur(0,y);
 +
                    }
  
    if ((a-1)>=0 && (b+2) < M && B[a-1][b+2])
+
                    if (a==2)
        return false;
+
                    maxfig();
  
    if ((a+1) < M && (b-2) >=0 && B[a+1][b-2])
+
                }
        return false;
 
  
    if ((a+1) < M && (b+2) < M && B[a+1][b+2])
 
        return false;
 
  
     if ((a-2) >=0 && (b-1) >=0 && B[a-2][b-1])
+
     if (o==4) {
        return false;
+
                cout<<endl<<"Конь"<<endl;
  
    if ((a-2) >=0 && (b+1) < M && B[a-2][b+1])
+
                if(a==1)
        return false;
+
                    {
 +
                    cin>>y;
 +
                    vsevarintyrasstavitnfigur(0,y);
 +
                    }
 +
                    if (a==2)
 +
                    maxfig();
 +
 
 +
              }
 +
 
 +
    if (o==5)  {
 +
                cout<<"Король"<<endl;
  
    if ((a+2) < M && (b-1) >= 0 && B[a+2][b-1])
+
                if(a==1)
        return false;
+
                {
 +
                    cin>>y;
 +
                    vsevarintyrasstavitnfigur(0,y);
  
    if ((a+2) < M && (b+1) < M && B[a+2][b+1])
+
                }
        return false;
+
                if (a==2)
  
    return true;
+
                      maxfig();
}
 
  
void Horse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
+
                }
{
 
    if(count==N) /// проверка количества расставленных фигур
 
    {
 
        showBoard();
 
    }
 
    if (a == M) /// не выходит ли за предел доски
 
        return;
 
    for (int j=b; j<M; ++j) ///рассматриваем первую строку
 
    {
 
        if(checkHorse(a, j)) ///проверка
 
        {
 
            B[a][j]=1; ///установка коня
 
            int l = a, b = j+1; ///смещение в другой столбец
 
  
            if (b == M) ///проверка, не крайний ли это столбец, так как тогда мы не можем продолжать расстановку (мы ее завершили)
 
            {
 
                b=0; ///обнуление переменной
 
                l++;    ///переход на следующую
 
 
             }
 
             }
            Horse(count+1,l,b); ///установка фигуры, увеличение счетчика
+
 
            B[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
+
 
        }
+
 
    }
 
    for(int i=a+1; i<M; ++i) ///заполнение строк
 
    {
 
        for (int j=0; j<M; ++j)
 
        {
 
            if(checkHorse(i, j)) ///проверка клетки, не бьется ли она другими конями
 
            {
 
                B[i][j]=1; ///установка коня
 
                int l = i, b = j+1; ///смещаемся на другой столбец
 
                if (b == M)
 
                {
 
                    b = 0;
 
                    l++;
 
                }
 
                Horse(count+1,l,b); ///установка фигуры с увеличением счетчика
 
                B[i][j]=0;  ///обнуление переменной
 
            }
 
        }
 
    }
 
 
}
 
}
  
bool checkKing(int a, int b) /// функция, проверяющая, бьет ли данную клетку король
 
{
 
    for(int i = a-1; i <= a+1; ++i)
 
    {
 
        for(int j = b-1; j <= b+1; ++j)
 
        {
 
            if (a>=0 && a < M && b>=0 && b < M && B[a][b])
 
                return false;
 
  
            if ((a+1) < M && (b-1) >=0 && B[a+1][b-1])
 
                return false;
 
  
            if ((a+1) < M && B[a+1][b])
 
                return false;
 
  
            if ((a+1) < M && (b+1) < M && B[a+1][b+1])
+
</syntaxhighlight>
                return false;
+
</div>
  
            if ((b+1) < M && B[a][b+1])
 
                return false;
 
  
            if ((a-1)>=0 && (b+1) < M && B[a-1][b+1])
 
                return false;
 
  
            if ((a-1) >=0 && B[a-1][b])
 
                return false;
 
  
            if ((a-1) >=0 && (b-1)>=0 && B[a-1][b-1])
+
'''[[Лосева Татьяна]]'''
                return false;
 
  
            if ((b-1) >= 0 && B[a][b-1])
+
'''Краткое описание алгоритма :'''
                return false;
+
Доска представлена в виде динамического массива;Для каждой фигуры написана отдельная функция проверки на возможность установки фигуры,проверяющая, находится ли эта фигура под ударом других.
        }
+
После выбора типа фигуры,используется  рекурсивная функция,которая проверяет возможные  расстановки через данную функцию проверки ,для данного типа фигуры.
    }
+
Для поиска максимального значения мы проверяем расстановку начиная с 0 количество фигур ,каждый раз увеличивая на 1,если количество расстановок станет равно нулю,то предыдущее количество фигур было максимальным.
  
    return true;
+
'''Инструкция''' : Пользователя попросят ввести размер доски,затем выбрать один из вариантов работы программы:1.поиск возможных расстановок для M фигур или 2.поиск максимального количества расстановок для данного поля,затем попросят выбрать тип фигуры и в первом случае количество фигур.При выводе на экран выводится номер расстановки и доска,на доске F- обозначены занятые клетки,0-пуская клетка.
}
+
Для 2 пункта выводится лишь число: максимальное количество фигур,которое можно расставить.
  
void King (int count, int a, int b) ///функция, расставляющая коней
+
Скачать можно : [http://tm.spbstu.ru/Файл:Шахматы_Лосева.rar тут]
{
 
    for (int j=b; j<M; ++j)  ///установка королей в первой строке
 
    {
 
        if(checkKing(a, j)) ///проверка данной клетки на возможность установки фигуры
 
        {
 
            B[a][j]=1; ///если по результатам проверки можно поставить фигуру, то мы ее ставим
 
            King(count+1,a,j); ///расстановка фигур для первой доски
 
            B[a][j]=0;  ///обнуление переменной
 
        }
 
    }
 
  
    for(int i=a+1; i<M; ++i) ///расстановка фигур
 
    {
 
        for (int j=0; j<M; ++j)
 
        {
 
            if(checkKing(i, j)) ///проверка данной клетки на возможность установки фигуры
 
            {
 
                B[i][j]=1;  /// если короля можно поставить, то ставим его в данную клетку
 
                King(count+1,i,j);
 
                B[i][j]=0;  ///обнуление переменной
 
            }
 
        }
 
    }
 
  
    if(count==N)
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    {
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
        showBoard();/// вывод шахмат на экран
+
#include<iostream>
        return;
+
using namespace std;
    }
+
int N;//размер доски NxN
 +
int **a;
 +
int *ax;
 +
int *by;
 +
int l = 0;//L-номер пункта в меню
 +
int M;//количество фигур
 +
bool isPrint = false;//переменная для вывода на экран,когда требуется,для удобства обозначим в начале false
 +
 
 +
 
 +
void print()//функция вывода на экран
 +
{
 +
for (int i = N - 1; i >= 0; --i)
 +
{
 +
for (int j = 0; j < N; ++j)
 +
{
 +
cout << ((a[j][i]) ? "F " : "0 ");//если (a[j][i]) истина,то есть клетка занята,ставим F,в другом случае,т.е.свободна,ставим 0
 +
}
 +
cout << '\n';
 +
}
 +
cout << '\n';
 +
 
 +
}
 +
bool Lad(int x, int y)//Ладья
 +
{
 +
for (int i = 0; i < N; ++i)
 +
{
 +
if (a[i][y] == 1 )//проверяем горизонталь:если клетка занята
 +
{
 +
return false;//возвращаем false
 +
}
 +
if (a[x][i] == 1)//проверяем вертикаль : если хотя бы одна клетка занята,то
 +
{
 +
return false;//возврашаем false
 +
}
 +
}
 +
return true;//ничего выше не выполняется,значит возвращаем правду:вертикаль и горизонталь свободна
 +
 
 
}
 
}
  
int main()
+
bool Kon(int x, int y)//Коняша
 
{
 
{
        cout << "Enter the size of the board: " << endl; ///ввод размера доски
+
int i[8] = {-2, -2, -1, -1, 1, 1, 2, 2};//координаты клеток,на которые может ходить конь,относительно текущей (8 вариантов)
        cin >> M;
+
int j[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
        B = new int*[M];
+
        for (int i=0; i<M; i++)
+
for (int k = 0; k < 8; k++)//8 вариантов хода
            B[i] = new int[M];
+
        for (int i = 0; i<M; i++)
+
{
            for (int j = 0; j<M; j++)
+
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//проверка выхода за границы массива
                B[i][j] = 0;
+
{
        int Var;
+
if (a[x + i[k]][y + j[k]] != 0)//клетка занята
        cout << '\n' << "1=your number of figures, 2=max number of figures" << endl;
+
{
        cin >> Var;
+
return false;//возвращем false
        int F;
+
}
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
+
}
                cin >> F;
+
}
        if (Var==1) /// если пользователь выбрал свое количество фигур, то мы выполняем следующие действия:
+
return true;////ничего выше не выполняется,значит возвращаем правду:все варианты ходов  свободны и конь никого не перебивает,тогда можно занять клетку
        {
+
 
                int mn;
+
}
                    cout << "Input the number of figures" << endl;
+
 
                    cin >> N;
+
 
                if (F==1)
+
 
                {
+
 
                    for (int i=0; i <M; ++i)
+
bool Korol(int x, int y)//Король
                        Queen(i,0);
+
{
                }
+
 
                if (F==2)
+
int i[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };//координаты клеток,на которые может ходить король,относительно текущей
                {
+
    int j[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
                    King(0,0,0);
 
                }
 
                if (F==3)
 
                {
 
                    Horse(0,0,0);
 
                }
 
                if (F==4)
 
                {
 
                    for (int i=0; i <M; ++i)
 
                        Rook(i,0);
 
                }
 
                if (F==5)
 
                {
 
                    for(int i = 0; i<2*M-1; ++i)
 
                        Elephant(i,0);
 
                }
 
            }
 
        else if (Var==2)      /// если пользователь выбрал максимальное количество фигур
 
        {
 
                int mn;
 
                if (F==1)
 
                {
 
                    mn=M;
 
                    cout <<  "Max number " << mn  << endl;  /// выводим максимальное количество фигур
 
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        for (int i=0; i < M; ++i)
 
                            Queen(i,0);
 
                    }
 
  
                if (F==2)
+
for(int k = 0; k < 8; k++)//8 вариантов хода
                {
+
{
                    mn=0.25*M*M;
+
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//прроверяем не выходит ли фигура за границы массива
                    cout << '\n' << "Max number " << mn <<  endl;
+
{
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
+
if (a[x + i[k]][y + j[k]] != 0)//если какой нибудь из вариантов хода занят
                    King(0,0,0);
+
{
                    }
+
return false;//то false
                if (F==3)
+
}
                {
+
}
                    mn=0.5*M*M;
+
}
                    cout <<  "Max number " << mn  << endl;
+
return true;//свободно,можно занимать
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
+
}
                    Horse(0,0,0);
 
                    }
 
                if (F==4)
 
                {
 
                    mn=M;
 
                    cout <<  "Max number " << mn  << endl;
 
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        for (int i=0; i <M; ++i)
 
                            Rook(i,0);
 
                    }
 
                if (F==5)
 
                {
 
                    mn=2*M-2;
 
                    cout <<  "Max number " << mn  << endl;
 
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        for(int i = 0; i<2*M-1; ++i)
 
                            Elephant(i,0);
 
                    }
 
                }
 
    }
 
  
 
+
bool Slon(int x, int y)
 
+
{
</syntaxhighlight>
+
int p1 = y - x;//номер диагонали слева направо
</div>
+
int p2 = y + x;//номер диагонали с права налево
 
+
for (int i = 0; i < N; i++)//проверяем левую диагональ
'''[[Савельева Ольга]]'''
+
{
 
+
if (i + p1 >= 0 && i + p1 < N)//проверка на выход за границы массива
 
+
{
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей: либо максимальное число вариантов, либо посмотреть наглядно на варианты. Человек вводит размер доски и тип фигуры.
+
if (a[i][i + p1] == 1) //проверяем диагональ
 
+
{
Скачать программу можно  [http://tm.spbstu.ru/:File:Шахматы0001.zip    ]
+
return false;//диагональ занята
 
+
}
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
}
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
if (-i + p2 >= 0 && -i + p2 < N)//вторая диагональ
 
+
{
#define windows
+
if (a[i][-i + p2] == 1)  
 
+
{
#include <stdio.h>
+
return false;//вторая диагональ занята
#include <vector>
+
}
 
+
}
#ifdef windows
+
}
#include <windows.h>
+
return true;//обе диагонали свободны,ура!
#endif  // windows
 
 
 
using namespace std;
 
 
 
#ifdef windows
 
HANDLE hCon;
 
#endif // windows
 
 
 
unsigned fact(int n) //factorial of a number
 
{
 
    unsigned long long ret = 1;
 
    for(int i = 2; i <= n; i++)
 
        ret *= i;
 
    return ret;
 
 
}
 
}
  
struct desk
+
bool Check(int x, int y)//Ферзь=Ладья+Слон
 
{
 
{
    char **deskFigures, **deskOccupy;  //desk with figures, desk with occupation counter for each cell
+
int p1 = y - x;//диагональ 1
    int x, y, size, a, f;  //pointer position(x, y), size of the desk, amount of prints, amount of figures
+
int p2 = y + x;//диагональ 2
    vector<pair<int, int> > *s; //stack of placed figures
+
for (int i = 0; i < N; ++i)
    bool stackIsUsed;  //if stack is needed
+
{
    desk(int size, bool stackIsUsed = true):x(0), y(0), size(size), a(0), f(0), stackIsUsed(stackIsUsed)
+
if (a[i][y] == 1 )//проверяем горизонталь
    {
+
{
        deskFigures = new char*[size];
+
return false;//занято
        for(int i = 0; i < size; i++)
+
}
            deskFigures[i] = new char[size];
+
if (a[x][i] == 1)//проверяем вертикаль
        deskOccupy = new char*[size];
+
{
        for(int i = 0; i < size; i++)
+
return false;//занято
            deskOccupy[i] = new char[size];
+
}
        if(stackIsUsed)
+
            s = new vector<pair<int, int> >;
+
if (i + p1 >= 0 && i + p1 < N)//выход за границы массива
        clear();
+
{
    }
+
if (a[i][i + p1] == 1) //проверяем 1 диагональ
    ~desk()
+
{
    {
+
return false;//занято
        for(int i = 0; i < size; i++)
+
}
            delete deskFigures[i];
+
}
        delete deskFigures;
+
if (-i + p2 >= 0 && -i + p2 < N)//выход за границы массива
        for(int i = 0; i < size; i++)
+
{
            delete deskOccupy[i];
+
if (a[i][-i + p2] == 1)//проверяем 2ую диагональ
        delete deskOccupy;
+
{
        if(stackIsUsed)
+
return false;//занято
            delete s;
+
}
    }
+
}
    void setKnight(int x, int y, int z) //increase all cells occupied by knight at (x, y) on z
+
}
    {
+
return true;//свободно!
        if(x + 2 < size)
+
}
        {
+
 
            if(y - 1 >= 0)
+
int  menu1()
                deskOccupy[x + 2][y - 1] += z;
+
{
            if(y + 1 < size)
+
cout << "Type of figure:" << endl << "1 - Ferz" << endl << "2 - Ladya" << endl << "3 - Slon" << endl << "4 - Kon" << endl << "5 - Korol" << endl;
                deskOccupy[x + 2][y + 1] += z;
+
cin >> l;
        }
+
return l;
        if(y + 2 < size)
+
}
        {
+
 
            if(x - 1 >= 0)
+
int num = 0;//номер расстановки
                deskOccupy[x - 1][y + 2] += z;
+
//пробует найти результаты решений.
            if(x + 1 < size)
+
 
                deskOccupy[x + 1][y + 2] += z;
+
void Func(int d,int K) //d-глубина рекурсии;K-сколько фигур нужно расставить
        }
+
{
        if(x - 2 >= 0)
+
if (d == K)//когда расставили нужное количество
        {
+
{
            if(y - 1 >= 0)
+
if (isPrint)//если true,то печатаем(в случае с MAX количеством доску печатать не нужно)
                deskOccupy[x - 2][y - 1] += z;
+
{
            if(y + 1 < size)
+
cout << "Result: " << num + 1 << '\n';//выводим нормер расстановки
                deskOccupy[x - 2][y + 1] += z;
+
print();//печатаем доску
        }
+
}
        if(y - 2 >= 0)
+
num++;//номер расстановки увеличивается
        {
+
return;
            if(x - 1 >= 0)
+
}
                deskOccupy[x - 1][y - 2] += z;
+
 
            if(x + 1 < size)
+
int minX = d != 0 ? ax[d - 1] : 0;//исходя из того куда быда поставлена предыдущая фигура
                deskOccupy[x + 1][y - 2] += z;
+
//,накладываются ограничения для выбора места новой,чтобы избежать поторений
        }
+
int minY = d != 0 ? by[d - 1] + 1 : 0;
    }
+
 
    void setBishop(int x, int y, int z) //increase all cells occupied by bishop at (x, y) on z
+
 
    {
+
bool isPossible = false;//Проверяет,возможно ли занять клетку
        for(int ix = 0, iy1 = y - x, iy2 = y + x; ix < size; ix++, iy1++, iy2--)
+
for (int i = minX; i < N; ++i)
            if(ix != x)
+
{
            {
+
 
                if((iy1 >= 0)and(iy1 < size))
+
for (int j = (i != minX) ? 0 : minY; j < N; ++j)
                    deskOccupy[ix][iy1] += z;
+
{
                if((iy2 >= 0)and(iy2 < size))
+
switch (l)//l- номер пункта в меню с фигурами
                    deskOccupy[ix][iy2] += z;
+
{
            }
+
case 1://ферзь
    }
+
isPossible = Check(i, j);
    void setRook(int x, int y, int z)  //increase all cells occupied by rook at (x, y) on z
+
break;
    {
+
case 2://Ладья
        for(int i = 0; i < size; i++)
+
isPossible = Lad(i, j);
        {
+
break;
            if(i != x)
+
case 3://Слон
                deskOccupy[i][y] += z;
+
            if(i != y)
+
isPossible = Slon(i, j);
                deskOccupy[x][i] += z;
+
break;
        }
+
case 4://Конь
    }
+
isPossible = Kon(i, j);
    void setKing(int x, int y, int z)  //increase all cells occupied by king at (x, y) on z
+
break;
    {
+
case 5://Король
        for(int ix = x - 1; ix <= x + 1; ix++)
+
isPossible = Korol(i, j);
            for(int iy = y - 1; iy <= y + 1; iy++)
+
break;
                if((ix >= 0)and(ix < size)and(iy >= 0)and(iy < size)and((ix != 0)or(iy != 0)))
+
}
                    deskOccupy[ix][iy] += z;
+
if (isPossible)//если клетку занять возмоно(функция вернула true)
    }
+
{
    void setFigure(int x, int y, int z, char figure)   //increase all cells occupied by figure
+
  a[i][j] = 1;//занимаем клетку
                                                        //and (x, y) on z
+
ax[d] = i;//запоминаем куда была поставлена фигура
    {
+
by[d] = j;//запоминаем куда была поставлена фигура
        deskOccupy[x][y] += z;
+
Func(d + 1, K);//вызываем рекурсивно
        switch(figure)
+
a[i][j] = 0;
        {
+
}
            case 'N':
+
}
                setKnight(x, y, z);
+
}
                break;
+
 
            case 'B':
+
return;
                setBishop(x, y, z);
+
}
                break;
+
 
            case 'R':
+
int main()
                setRook(x, y, z);
+
{
                break;
+
 
            case 'Q':
+
cout << "Enter size: ";//нужно ввести размер доски
                setBishop(x, y, z);
+
cin >> N;//считываем размер доски
                setRook(x, y, z);
+
 
                break;
+
a = new int*[N];//создаём двумерный массив,т.е.нашу доску
            case 'K':
+
for (int i = 0; i < N; i++)
                setKing(x, y, z);
+
{
                break;
+
a[i] = new int[N];
        }
+
for (int j = 0; j < N; j++)
    }
+
a[i][j] = 0;//заполняем нулями
    bool putFigure(int x, int y, char figure)   //place figure on desk and update occupied cells
+
}
    {
+
        if(deskFigures[x][y] > 0)
+
ax = new int[N];//массивы для сохранения координаты каждой фигуры,чтобы избежать повторений
            return false;
+
by = new int[N];
        deskFigures[x][y] = figure;
+
 
        if(stackIsUsed)
+
int d;//пункт в меню
            s -> push_back(make_pair(x, y));
+
cout<<"1 - Rasstanovka figur"<<endl<<"2 - MAX znachenie"<<endl;//два варианта работы программы
        setFigure(x, y, 1, figure);
+
cin>>d;//считываем выбор пользователя
        f++;
+
if(d==1)//если выбирает расстановку
        return true;
+
{  
    }
+
menu1();//то спрашиваем для какой фигуры
    int cellsLeft() //amount of cells after pointer
+
cout<<"How many figures?"<<endl;//и как много будет фигур
    {
+
    cin>>M;//считываем количество фигур
        return (size - y) * size - x;
+
isPrint = true;//в этом случае будем выводить на экран
    }
+
Func(0,M);//запуск рекурсивной функции
    bool putNextFree(char figure)  //attempt to put figure on the next free(and not occupied) place
+
}
    {
+
 
        if(y >= size)
+
if (d == 2)//случай подсчёта максимального значения
            return false;
+
{
        while(deskOccupy[x][y] > 0)
+
int n = 0;//изачально max=0
        {
+
menu1();//выбираем фигуру
            if(++x == size)
+
            {
+
do//начало цикла
                if(++y == size)
+
{
                    return false;
+
num = 0;
                x = 0;
+
Func(0, ++n);//запускаем каждый раз увеличивая значение фигур и считаем количество расстановок
            }
+
} while (num != 0);//количество вариантов не должно быть равно нулю
        }
+
cout <<"MAX ="<< n - 1 << endl;//если количество вариантов = 0,то выходим из цикла и предыдущее значение  максимальное
        return putFigure(x, y, figure);
+
}
    }
+
    void removeFigure(int x, int y) //remove figure from (x, y)
+
 
    {
+
int z;
        if(deskFigures[x][y]!=0)
+
cin >> z;
            setFigure(x, y, -1, deskFigures[x][y]);
+
 
        deskFigures[x][y] = 0;
+
return 0;
        f--;
+
}
    }
+
</syntaxhighlight>
    void removeBishop(int diag, bool color, bool left)  //remove bishop
+
</div>
    {
+
 
        if(color)  //true - white, false - black
+
'''[[Степанянц Степан]]'''
        {
+
 
            if(diag > 0)    //diag - number of diagonal
+
'''Программа''': 1)Программа получает все возможные варианты расстановок одинаковых фигур на поле боя(шахматной доске) так, чтобы они не смогли бить друг друга.2)Программа выводит максимальное число фигур, которые можно поставить на шахматную доску nxn так, чтобы они не смогли бить друг друга.
            {
+
 
                int diff = left ? 0 : diag * 2;
+
'''Идея алгоритма''': Функция вызывает саму себя(рекурсия) в рекурсии фигура ставится на небьющуюся клетку и помечаются клетки, которые бьются этой фигурой.Если дальше ставить нельзя, то начинается обратный ход:фигура убирается, и запоминается место, где она стояла, и вновь вызывается функция.
                removeFigure(diff, diag * 2 - diff);
+
 
                removeFigure(size - diff - 1, size - diag * 2 + diff - 1);
+
Скачать можно [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
            }
+
 
            else
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
            if(left)    //determine position of the bishop on the diagonal
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
                removeFigure(0, 0);
+
#include <iostream>
            else
+
#include <vector>
                removeFigure(size - 1, size - 1);
+
 
        }
+
using namespace std;
        else
+
 
        {
+
 
            if(diag > 0)
+
 
            {
+
//задаю массивы в которых изображены все ходы определенных фигур
                int diff = left ? 0 : diag * 2;
+
int d = 0;
                removeFigure(size - diff - 1, diag * 2 - diff);
+
int d_knight[2][8] = {{1, 1, -1, -1, 2, 2, -2, -2},
                removeFigure(diff, size - diag * 2 + diff - 1);
+
    {2, -2, 2, -2, 1, -1, 1, -1}};
            }
+
int d_bish[4][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
            else
+
int d_king[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
            if(left)
+
//Проверяем, не выходим ли мы за поле
                removeFigure(0, size - 1);
+
bool ok(int x, int y, int n) {
             else
+
    if (x < 0 || y < 0 || x >= n || y >= n)
                removeFigure(size - 1, 0);
+
        return false;
 +
    return true;
 +
}
 +
 
 +
void print(int n, vector<vector<pair<bool, int> > > board) {
 +
    for (int i = 0; i < n; i++) {
 +
        for (int j = 0; j < n; j++) {
 +
             cout << ((board[i][j].first) ? " X " : " 0 ");
 
         }
 
         }
 +
        cout << '\n';
 
     }
 
     }
     void putBishop(int diag, bool color, bool left) //place bishop
+
     cout << "-------------------------------------\n";
    {
+
}
        if(color)
+
//Рекурсивная функция
        {
+
int func(int n, int k, int count, vector<vector<pair<bool, int> > > board, int ii, int jj, int fig, int task) {
            if(diag > 0)
+
    int ans = 0;
            {
+
    if (count == k && !task) {
                int diff = left ? 0 : diag * 2;
+
        print(n, board);
                putFigure(diff, diag * 2 - diff, 'B');
+
        return 1;
                putFigure(size - diff - 1, size - diag * 2 + diff - 1, 'B');
 
            }
 
            else
 
            if(left)
 
                putFigure(0, 0, 'B');
 
            else
 
                putFigure(size - 1, size - 1, 'B');
 
        }
 
        else
 
        {
 
            if(diag > 0)
 
            {
 
                int diff = left ? 0 : diag * 2;
 
                putFigure(size - diff - 1, diag * 2 - diff, 'B');
 
                putFigure(diff, size - diag * 2 + diff - 1, 'B');
 
            }
 
            else
 
            if(left)
 
                putFigure(0, size - 1, 'B');
 
            else
 
                putFigure(size - 1, 0, 'B');
 
        }
 
 
     }
 
     }
     void swapBishops(int diag, bool color, bool left)   //move pair bishops to another borders
+
     else if(task) {
    {
+
         ans = max(ans, count);
         removeBishop(diag, color, left);
 
        putBishop(diag, color, not(left));
 
 
     }
 
     }
     void figureBefore() //remove one figure from stack and change pointer to the next position after figure was placed
+
     for (int i = ii + jj / n; i < n; i++) {
    {
+
         for (int j = jj % n; j < n; j++) {
         pair<int, int> c = s -> back();
+
            if (!board[i][j].first && !board[i][j].second) {
        s -> pop_back();
+
                switch (fig) {
        x = c.first;
+
                    case 1://конь
        y = c.second;
+
                        for (int k = 0; k < 8; k++) {
        removeFigure(x, y);
+
                            if (ok(i + d_knight[0][k], j + d_knight[1][k], n))
        if(++x == size)
+
                                board[i + d_knight[0][k]][j + d_knight[1][k]].second++;
        {
+
                        }
            x = 0;
+
                        break;
            y++;
+
                    case 2://слон
        }
+
                        for (int k = 0; k < n; k++) {
    }
+
                            for (int l = 0; l < 4; l++) {
    void clear()    //clear the desk
+
                                if (ok(i + k * d_bish[l][0], j + k * d_bish[l][1], n))
    {
+
                                    board[i + k * d_bish[l][0]][j + k * d_bish[l][1]].second++;
        for(int ix = 0; ix < size; ix++)
+
                            }
            for(int iy = 0; iy < size; iy++)
+
                        }
            {
+
                        break;
                deskFigures[ix][iy] = 0;
+
                    case 3: // ладья
                deskOccupy[ix][iy] = 0;
+
                        for (int k = 0; k < n; k++)
            }
+
                            board[i][k].second++, board[k][j].second++;
        x = 0;
+
                        break;
        y = 0;
+
                    case 4: // король
        if(stackIsUsed)
+
                        for (int k = 0; k < 8; k++)
            s -> empty();
+
                            if (ok(i + d_king[k][0], j + d_king[k][1], n))
        f = 0;
+
                                board[i + d_king[k][0]][j + d_king[k][1]].second++;
    }
+
                        break;
    void show() //show the desk
+
                    case 5: // ферзь
    {
+
                        for (int k = 0; k < 8; k++)
        a++;
+
                            for (int l = 0; l < n; l++)
        printf("%i:\n", a);
+
                                if (ok(i + l * d_king[k][0], j + l * d_king[k][1], n))
        #ifdef windows
+
                                    board[i + l * d_king[k][0]][j + l * d_king[k][1]].second++;
        unsigned background = 4;
+
                        break;
        #else
+
                       
        printf("\x1b[31m");
 
        char background = 47;
 
        #endif  //windows
 
        for(int y = 0; y < size; y++)
 
            for(int x = 0; x < size; x++)
 
            {
 
                #ifdef windows
 
                SetConsoleTextAttribute(hCon, background);
 
                #else
 
                printf("\x1b[%dm", background);
 
                #endif  //windows
 
                if(deskFigures[x][y] == 0)
 
                    putchar(' ');
 
                else
 
                    putchar(deskFigures[x][y]);
 
                #ifdef windows
 
                if(x < size - 1)
 
                    background = background == 4 ? 116 : 4;
 
                else
 
                {
 
                    SetConsoleTextAttribute(hCon, 7);
 
                    putchar('\n');
 
 
                 }
 
                 }
                 #else
+
                 //Рекурсия
                 if(x < size - 1)
+
                board[i][j].first = true;
                     background = background == 47 ? 40 : 47;
+
                 if (!task)
 +
                     ans += func(n, k, count + 1, board, i, j + 1, fig, task);
 +
              //обратный ход
 
                 else
 
                 else
                 {
+
                    ans = max(ans, func(n, k, count + 1, board, i, j + 1, fig, task));
                     printf("\x1b[0m\n");
+
                board[i][j].first = false;
                     if(y < size - 1)
+
                 switch (fig) {
                         printf("\x1b[31m");
+
                     case 1:
                 }
+
                        for (int k = 0; k < 8; k++) {
                #endif // windows
+
                            if (ok(i + d_knight[0][k], j + d_knight[1][k], n))
 +
                                board[i + d_knight[0][k]][j + d_knight[1][k]].second--;
 +
                        }
 +
                        break;
 +
                     case 2:
 +
                        for (int k = 0; k < n; k++) {
 +
                            for (int l = 0; l < 4; l++) {
 +
                                if (ok(i + k * d_bish[l][0], j + k * d_bish[l][1], n))
 +
                                    board[i + k * d_bish[l][0]][j + k * d_bish[l][1]].second--;
 +
                            }
 +
                        }
 +
                        break;
 +
                    case 3:
 +
                        for (int k = 0; k < n; k++)
 +
                            board[i][k].second--, board[k][j].second--;
 +
                        break;
 +
                    case 4:
 +
                        for (int k = 0; k < 8; k++)
 +
                            if (ok(i + d_king[k][0], j + d_king[k][1], n))
 +
                                board[i + d_king[k][0]][j + d_king[k][1]].second--;
 +
                        break;
 +
                    case 5:
 +
                         for (int k = 0; k < 8; k++)
 +
                            for (int l = 0; l < n; l++)
 +
                                if (ok(i + l * d_king[k][0], j + l * d_king[k][1], n))
 +
                                    board[i + l * d_king[k][0]][j + l * d_king[k][1]].second--;
 +
                        break;
 +
                 }
 
             }
 
             }
 +
        }
 +
        jj = 0;
 
     }
 
     }
};
+
    return ans;
 
+
}
int m = -1; //0 for number of arrangements, 1 for all variants
+
//меню
 
+
int main() {
unsigned lookForFigure(int size, int amount, char figure, bool show = true) //brute-force
+
    int fig, task;
{
+
    int n, k;
     desk *d  = new desk(size);
+
    cout << "Please, input the task number: 1 - amount of solutions, 2 - maximum of figures\n";
     unsigned ret = 0;
+
    cin >> task;
     while((d -> f > 0)or(d -> cellsLeft() >= amount))
+
     task--;
        if(not(d -> putNextFree(figure)))
+
     cout << "Please, input figure type: 1 - knight, 2 - bishop, 3 - castle, 4 - king, 5 - queen\n";
         {
+
     cin >> fig;
            if(d -> f == amount)
+
    cout << "Please, input the size of the board\n";
            {
+
    cin >> n;
                if(show)
+
    if (!task) {
                    d -> show();
+
         cout << "Please, input number of figures\n";
                ret++;
+
        cin >> k;
            }
+
    }
            d -> figureBefore();
+
    vector<vector<pair<bool, int> > > v = vector<vector<pair<bool, int> > >(n, vector <pair<bool, int> >(n, {false, 0}));
        }
+
     cout << func(n, k, 0, v, 0, 0, fig, task);
     delete d;
 
    return ret;
 
 
}
 
}
 +
</syntaxhighlight>
 +
</div>
 +
 +
'''[[Лобанов Илья]]'''
 +
 +
'''Описание алгоритма''':
 +
 +
Программа проверяет возможность расстановки фигур на доске M*M . При выводе на экран на экран клетки,занятые фигурами ,помечаются буквами,соответствующими первой букве типа фигуры. Также программа считает максимальное число фигур определенного типа,которые можно расставить на доске.
  
void lookForKnight(int size, int amount)    //arrangements of knights
+
'''Инструкция''':
{
+
 
    if(m == 0)
+
В окне консоли пользователю предлагается выбрать 2 типа работы программы, затем пользователь вводит размер доски(четный),тип и количество фигур,которые необходимо разместить на доске.В зависимости от режима работы программы ,будет выведено либо максимально возможное число расстановок фигур,либо максимальное число фигур.
    {
+
Скачать можно [[http://tm.spbstu.ru/File:ConsoleApplication54.rar тут]]
        printf("Amount of arrangements: ");
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
        if(size == 2)
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
            printf("1\n");
+
#include <iostream>
        else
+
#include <windows.h>
        if(size == 4)
+
using namespace std;
            printf("6\n");
 
        else
 
            printf("2\n");
 
    }
 
    else
 
    {
 
        desk *d = new desk(size);
 
        if(size == 2)
 
        {
 
            d -> putFigure(0, 0, 'N');
 
            d -> putFigure(0, 1, 'N');
 
            d -> putFigure(1, 0, 'N');
 
            d -> putFigure(1, 1, 'N');
 
            d -> show();
 
        }
 
        else
 
        if(size==4)
 
            lookForFigure(size, amount, 'N');
 
        else
 
        {
 
            for(int x = 0; x < size; x++)
 
                for(int y = 0;y < size; y++)
 
                    if(x + y % 2 == 0)
 
                        d -> putFigure(x, y, 'N');
 
            d -> show();
 
            d -> clear();
 
            for(int x = 0; x < size; x++)
 
                for(int y = 0;y < size; y++)
 
                    if(x + y % 2 == 1)
 
                        d -> putFigure(x, y, 'N');
 
            d -> show();
 
        }
 
    }
 
}
 
  
void lookForBishop(int size, int amount)    //arrangements of bishops
+
enum type{peshka, king, kon, ladya, slon, queen}; // все возможные типы фигур
{
+
const char symbols[] = "pKklsQ"; // буквенное обозначение каждой фигуры:p - пешка, K - король, k - конь, l- ладья, s - слон, Q - ферзь
    if(m == 0)
+
const int NONE = INT_MAX;//константа для обозначения пустой клетки
        printf("Amount of arrangements: %u", (unsigned) 1 << size);
+
int M, **desk, *colons, *rows, *diag_1, *diag_2;
    else
 
    {
 
        desk *d = new desk(size, false);
 
        bool *b = new bool[size];
 
        for(int dw = 0; dw < size/2; dw++)
 
        {
 
            d -> putBishop(dw, true, false);
 
            d -> putBishop(dw, false, false);
 
        }
 
        int p = size - 1;
 
        for(;;)
 
        {
 
            d -> show();
 
            while(b[p])
 
            {
 
                d -> swapBishops(p % (size / 2), p < size / 2, true);
 
                b[p--] = false;
 
                if(p < 0)
 
                    return;
 
            }
 
            b[p] = true;
 
            d -> swapBishops(p % (size / 2), p < size / 2, false);
 
            p = size - 1;
 
        }
 
    }
 
}
 
  
void lookForRook(int size, int amount)  //arrangements of rooks
+
// структура для описания клектки доски
 +
struct point
 
{
 
{
    if(m == 0)
+
int x, y;
        printf("Amount of arrangements: %u", fact(size));
+
point(int x = 0, int y = 0): x(x), y(y) {}
    else
+
point &operator++()
        lookForFigure(size, amount, 'R');
+
{
}
+
if (y == M - 1)
 
+
{
void lookForQueen(int size, int amount) //arrangements of queens
+
++x;
{
+
y = 0;
    if(m == 0)
+
}
        printf("Amount of arrangements: %u", lookForFigure(size, amount, 'Q', false));
+
else
    else
+
++y;
        lookForFigure(size, amount, 'Q');
+
return *this;
}
+
}
 +
point operator+(const point &p) const
 +
{
 +
return point(x + p.x, y + p.y);
 +
}
 +
point next() const
 +
{
 +
point r = *this;
 +
return ++r;
 +
}
 +
};
 +
 
  
void lookForKing(int size, int amount) //arrangements of kings
+
int *new_array(int n)
 
{
 
{
    if(m == 0)
+
int *a = new int[n];
        printf("Amount of arrangements: %u", lookForFigure(size, amount, 'K', false));
+
fill(a, a + n, NONE);
    else
+
return a;
        lookForFigure(size, amount, 'K');
 
 
}
 
}
  
int main()
+
// Количество свободных клеток от клетки p до конца доски
 +
int rest(const point &p, type t)
 
{
 
{
    int s = -1, f = -1; //s - size, f - figure
+
int r0 = (M - p.x) * M - p.y, r,
    #ifdef windows
+
m = M - p.x,
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
+
s_2 = (m + 1) / 2 * M;
    #endif // windows
+
switch (t)
    sizeInput:
+
{
    printf("Enter size of the desk:\n");
+
case peshka:
    scanf("%i", &s);
+
case kon:
    if((s<=0)or(s%2!=0))
+
r = s_2; break;
    {
+
case king:
        printf("Size must be above 0 and even\n");
+
r = s_2 / 2; break;
        goto sizeInput;
+
case ladya:
    }
+
case queen:
    modeInput:
+
return m;
    printf("Enter mode:\n\t0: Print amount of results\n\t1: Print all results\n");
+
case slon:
    scanf("%i", &m);
+
r = m + M - 1;
    if((m<0)or(m>1))
+
}
    {
+
return min(r0, r);
        printf("Mode can be 0 or 1\n");
+
}
        goto modeInput;
+
 
    }
+
// Помечает клетку доски номером i
    figureInput:
+
void set(const point &p, type t, int i)
    printf("Enter figures to be placed\n\t0: Knight (N)\n\t1: Bishop (B)\n\t2: Rook (R)\n\t3: Queen (Q)\n\t4: King (K)\n");
+
{
    scanf("%i", &f);
+
if (t == peshka || t == king || t == kon)
    if((f<0)or(f>4))
+
desk[p.x][p.y] = i;
    {
+
else
        printf("Figure number ranges from 0 to 4\n");
+
{
        goto figureInput;
+
if (t == ladya || t == queen)
    }
+
colons[p.y] = rows[p.x] = i;
    switch(f)
+
if (t == slon || t == queen)
    {
+
diag_1[p.x+p.y] = diag_2[p.x-p.y+M-1] = i;
        case 0:
+
}
            if(s==2)
 
                lookForKnight(s, 4);
 
            else
 
                lookForKnight(s, s *s / 2);
 
            break;
 
        case 1:
 
            lookForBishop(s, 2 * s - 2);
 
            break;
 
        case 2:
 
            lookForRook(s, s);
 
            break;
 
        case 3:
 
            if(s==2)
 
                lookForQueen(s, 1);
 
            else
 
                lookForQueen(s, s);
 
            break;
 
        case 4:
 
            lookForKing(s, (s / 2) * (s / 2));
 
            break;
 
    }
 
    return 0;
 
 
}
 
}
  
 +
// Можно ли поставить фигуру номер i на клетку p
 +
bool empty(const point &p, type t, int i)
 +
{
 +
const int n_attack[3] = {4, 8, 8};
 +
const point attack[3][8] = {{point(1, 1), point(1, -1), point(-1, 1), point(-1, -1)}, //кол-во вариантов атаки для пешки
 +
{point(1, 1), point(1, -1), point(-1, 1), point(-1, -1), point(1, 0), point(-1, 0), point(0, 1), point(0, -1)}, // кол-во вариантов атаки для короля
 +
{point(1, 2),point(-1, 2),point(1, -2), point (-1,-2), point (2, 1), point (2,-1), point (-2, 1),point (-2,-1)}};  //количество вариантов атаки для коня
 +
switch(t)
 +
{
 +
case peshka:
 +
case king:
 +
case kon:
 +
for (int k = 0; k < n_attack[t]; k++)
 +
{
 +
point q = p + attack[t][k];
 +
if (q.x >= 0 && q.x < M && q.y >= 0 && q.y < M && desk[q.x][q.y] < i)
 +
return false;
 +
}
 +
return true;
 +
case ladya:
 +
return colons[p.y] > i && rows[p.x] > i;
 +
case slon:
 +
return diag_1[p.x+p.y] > i && diag_2[p.x-p.y+M-1] > i;
 +
case queen:
 +
return colons[p.y] > i && rows[p.x] > i && diag_1[p.x+p.y] > i && diag_2[p.x-p.y+M-1] > i;
 +
}
 +
}
  
 +
//печатает заданное количество досок на экране
 +
void print(point **figures, int n_desks, int N, type t, ostream &out = cout)
 +
{
 +
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
 +
for (int n = 0; n < n_desks; n++)
 +
{
 +
out << " \xdb";
 +
for (int i = 0; i < M * 2 + 2; i++)
 +
out << "\xdf";
 +
out << "\xdb";
 +
}
 +
out << endl;
  
</syntaxhighlight>
+
int *K = new int[n_desks];
</div>
+
fill(K, K + n_desks, 0);
 
+
for (int i = 0; i < M; i++)
 
+
{
'''[[Сенников Иван]]'''
+
for (int n = 0; n < n_desks; n++)
 
+
{
'''Суть программы:''' Программа позволяет на шахматной доске MxM расставить N фигур K типа всевозможными способами, причем при этом производится расчет максимального количества фигур K типа, которые можно расставить на данной доске MxM.
+
int &k = K[n];
 
+
out << " \xdb ";
'''Идея:''' Шахматная доска представляет собой двумерный динамический массив. С помощью рекурсивного метода программа пробегает по массиву, проверяя клетки доски по всем направлениям на то, атакованы ли они другими фигурами этого типа. В зависимости от количества поставленных фигур изменяется количество итераций. В новую клетку ставиться новая фигура и так до тех пор, пока не выполнится написанное выше условие, после чего начнется обратный ход.
+
for (int j = 0; j < M; j++)
 
+
{
'''Инструкция:''' Программа написана в виде меню на английском языке: пользователю будет предоставлена возможность сначала обозначить размер доски, а после выбрать тип фигур и их количество для дальнейшей работы с ними. Комментарии к программе написаны также на английском языке.
+
SetConsoleTextAttribute(hConsole, (i + j) % 2 == 0 ? 0xf0 : 0xf);
 
+
if (k < N && i == figures[n][k].x && j == figures[n][k].y)
Ссылка для скачиваний: [http://tm.spbstu.ru/Файлы:Chess_v2.0.zip здесь].
+
{
 
+
out << ' ' << symbols[t];
'''[[Степанянц Степан]]'''
+
k++;
 
+
}
'''Программа''': 1)Программа получает все возможные варианты расстановок одинаковых фигур на поле боя(шахматной доске) так, чтобы они не смогли бить друг друга.2)Программа выводит максимальное число фигур, которые можно поставить на шахматную доску nxn так, чтобы они не смогли бить друг друга.
+
else
 
+
out << "  ";
'''Идея алгоритма''': Функция вызывает саму себя(рекурсия) в рекурсии фигура ставится на небьющуюся клетку и помечаются клетки, которые бьются этой фигурой.Если дальше ставить нельзя, то начинается обратный ход:фигура убирается, и запоминается место, где она стояла, и вновь вызывается функция.
+
}
 
+
SetConsoleTextAttribute(hConsole, 0x70);
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
+
out << " \xdb";
 +
}
 +
out << endl;
 +
}
 +
delete[] K;
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
for (int n = 0; n < n_desks; n++)
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
{
#include <iostream>
+
out << " \xdb";
#include <vector>
+
for (int i = 0; i < M * 2 + 2; i++)
 
+
out << "\xdc";
using namespace std;
+
out << "\xdb";
 
+
}
 
+
out << endl << endl;
 
 
//задаю массивы в которых изображены все ходы определенных фигур
 
int d = 0;
 
int d_knight[2][8] = {{1, 1, -1, -1, 2, 2, -2, -2},
 
    {2, -2, 2, -2, 1, -1, 1, -1}};
 
int d_bish[4][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
 
int d_king[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
 
//Проверяем, не выходим ли мы за поле
 
bool ok(int x, int y, int n) {
 
    if (x < 0 || y < 0 || x >= n || y >= n)
 
        return false;
 
    return true;
 
 
}
 
}
  
void print(int n, vector<vector<pair<bool, int> > > board) {
+
// Вывести все возможные расположения на доске N фигур
    for (int i = 0; i < n; i++) {
+
void all_placements(int N, type t)
        for (int j = 0; j < n; j++) {
+
{
            cout << ((board[i][j].first) ? " X " : " 0 ");
+
desk = NULL;
        }
+
colons = rows = diag_1 = diag_2 = NULL;
        cout << '\n';
+
// создание необходимых массивов, отмечающих занятость клеток, в зависимости от вида фигуры
    }
+
if (t == peshka || t == king || t == kon)
    cout << "-------------------------------------\n";
+
{
}
+
desk = new int*[M];
//Рекурсивная функция
+
for (int j = 0; j < M; j++)
int func(int n, int k, int count, vector<vector<pair<bool, int> > > board, int ii, int jj, int fig, int task) {
+
desk[j] = new_array(M);
    int ans = 0;
+
}
    if (count == k && !task) {
+
else
        print(n, board);
+
{
        return 1;
+
if (t == ladya || t == queen)
    }
+
{
    else if(task) {
+
colons = new_array(M);
        ans = max(ans, count);
+
rows = new_array(M);
    }
+
}
    for (int i = ii + jj / n; i < n; i++) {
+
if (t == slon || t == queen)
        for (int j = jj % n; j < n; j++) {
+
{
            if (!board[i][j].first && !board[i][j].second) {
+
diag_1 = new_array(2*M-1);
                switch (fig) {
+
diag_2 = new_array(2*M-1);
                    case 1://конь
+
}
                        for (int k = 0; k < 8; k++) {
+
}
                            if (ok(i + d_knight[0][k], j + d_knight[1][k], n))
+
                                board[i + d_knight[0][k]][j + d_knight[1][k]].second++;
+
const int W = 80 / (2 * M + 5);//количество досок,помещающихся на экране
                        }
+
point **figures = new point*[W];//массив фигур
                        break;
+
for (int j = 0; j < W; j++)
                    case 2://слон
+
figures[j] = new point[N];
                        for (int k = 0; k < n; k++) {
+
 
                            for (int l = 0; l < 4; l++) {
+
int i = 0, // номер фигуры
                                if (ok(i + k * d_bish[l][0], j + k * d_bish[l][1], n))
+
k = 0; //номер комбинации
                                    board[i + k * d_bish[l][0]][j + k * d_bish[l][1]].second++;
+
while (true)
                            }
+
{
                        }
+
if (rest(figures[k%W][i], t) < N - i) // если оставшиеся фигуры не помещаются на доске
                        break;
+
{
                    case 3: // ладья
+
if (i == 0) // если все комбинации закончились
                        for (int k = 0; k < n; k++)
+
{
                            board[i][k].second++, board[k][j].second++;
+
// вывод оставшихся досок
                        break;
+
if (k % W)
                    case 4: // король
+
print(figures, k % W, N, t);
                        for (int k = 0; k < 8; k++)
+
cout << "Amount of combinations: " << k << endl;
                            if (ok(i + d_king[k][0], j + d_king[k][1], n))
+
break;
                                board[i + d_king[k][0]][j + d_king[k][1]].second++;
+
}
                        break;
+
// переходим к предыдущей фигуре и помечаем клетку пустой
                    case 5: // ферзь
+
set(figures[k%W][--i], t, NONE);
                        for (int k = 0; k < 8; k++)
+
// сдвигаем фигуру на шаг вперёд
                            for (int l = 0; l < n; l++)
+
++figures[k%W][i];
                                if (ok(i + l * d_king[k][0], j + l * d_king[k][1], n))
+
}
                                    board[i + l * d_king[k][0]][j + l * d_king[k][1]].second++;
+
else if (!empty(figures[k%W][i], t, i)) // если фигуры помещаются, но текущая клетка под ударом
                        break;
+
// сдвигаем текущую фигуру на шаг вперёд
                       
+
++figures[k%W][i];
                }
+
else if (i == N - 1) // если ставим последнюю фигуру
                //Рекурсия
+
{
                board[i][j].first = true;
+
// если текущая доска - последняя на строке экрана, выводим W досок
                if (!task)
+
if ((k + 1) % W == 0)
                    ans += func(n, k, count + 1, board, i, j + 1, fig, task);
+
print(figures, W, N, t);
              //обратный ход
+
// копирование комбинаций фигур на следующую доску
                else
+
for (int j = 0; j < N; j++)
                    ans = max(ans, func(n, k, count + 1, board, i, j + 1, fig, task));
+
figures[(k+1)%W][j] = figures[k%W][j];
                board[i][j].first = false;
+
// переход к следующей доске
                switch (fig) {
+
k++;
                    case 1:
+
//сдвигаем текущую фигуру на шаг вперёд
                        for (int k = 0; k < 8; k++) {
+
++figures[k%W][i];
                            if (ok(i + d_knight[0][k], j + d_knight[1][k], n))
+
}
                                board[i + d_knight[0][k]][j + d_knight[1][k]].second--;
+
else // если ставим не последнюю фигуру
                        }
+
{
                        break;
+
// помечаем текущую клетку номером i
                    case 2:
+
set(figures[k%W][i], t, i);
                        for (int k = 0; k < n; k++) {
+
//ставим следующую фигуру на клетку после текущей
                            for (int l = 0; l < 4; l++) {
+
figures[k%W][i+1] = figures[k%W][i].next();
                                if (ok(i + k * d_bish[l][0], j + k * d_bish[l][1], n))
+
// переходим к следующей фигуре
                                    board[i + k * d_bish[l][0]][j + k * d_bish[l][1]].second--;
+
i++;
                            }
+
}
                        }
+
}
                        break;
+
 
                    case 3:
+
//освобождение памяти
                        for (int k = 0; k < n; k++)
+
for (int j = 0; j < W; j++)
                            board[i][k].second--, board[k][j].second--;
+
delete[] figures[j];
                        break;
+
delete[] figures;
                    case 4:
+
if (desk)
                        for (int k = 0; k < 8; k++)
+
{
                            if (ok(i + d_king[k][0], j + d_king[k][1], n))
+
for (int j = 0; j < M; j++)
                                board[i + d_king[k][0]][j + d_king[k][1]].second--;
+
delete[] desk[j];
                        break;
+
delete[] desk;
                    case 5:
+
}
                        for (int k = 0; k < 8; k++)
+
if (colons)
                            for (int l = 0; l < n; l++)
+
{
                                if (ok(i + l * d_king[k][0], j + l * d_king[k][1], n))
+
delete[] colons;
                                    board[i + l * d_king[k][0]][j + l * d_king[k][1]].second--;
+
delete[] rows;
                        break;
+
}
                }
+
if (diag_1)
            }
+
{
        }
+
delete[] diag_1;
        jj = 0;
+
delete[] diag_2;
    }
+
}
    return ans;
 
}
 
//меню
 
int main() {
 
    int fig, task;
 
    int n, k;
 
    cout << "Please, input the task number: 1 - amount of solutions, 2 - maximum of figures\n";
 
    cin >> task;
 
    task--;
 
    cout << "Please, input figure type: 1 - knight, 2 - bishop, 3 - castle, 4 - king, 5 - queen\n";
 
    cin >> fig;
 
    cout << "Please, input the size of the board\n";
 
    cin >> n;
 
    if (!task) {
 
        cout << "Please, input number of figures\n";
 
        cin >> k;
 
    }
 
    vector<vector<pair<bool, int> > > v = vector<vector<pair<bool, int> > >(n, vector <pair<bool, int> >(n, {false, 0}));
 
    cout << func(n, k, 0, v, 0, 0, fig, task);
 
 
}
 
}
</syntaxhighlight>
 
</div>
 
  
'''[[Александр Сюрис]]'''
 
  
Программа работает в двух режимах: поиск максимального числа фигур для заданного поля и количество возможных расстановок заданного числа фигур для заданного поля.
+
int main()
 
+
{
'''Алгоритм:''
+
system("color 70"); // Установка серого фона и чёрного текста
 
+
while (true)
#Для поиска количества возможных расстановок заданного числа фигур для заданного поля – Проверяется, возможно ли поставить фигуру в данную клетку, рекурсивно перебирает для каждой клетки поля, как начальной клетки, все варианты расстановки заданного количества  фигур относительно нее и выводит на экран все расстановки, которые подходят условиям.
+
{
#Для поиска максимального числа фигур для заданного поля –  Проверяется, можно ли поставить одну фигуру, две, три и так далее, пока фигур больше поставить будет нельзя.
+
cout << "Choose the mode:\n1 - all possible variants of figures' placement\n2 - maximum number of figures which can be placed on the desk\nq - quit\n\n";
 
+
char c;
Скачать можно  [http://mech.spbstu.ru/File:%D0%A8%D0%B0%D1%85%D0%BC%D0%B0%D1%82%D1%8B(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%A1%D1%8E%D1%80%D0%B8%D1%81).zip  тут].
+
cin >> c;
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
cin.ignore(100, '\n');
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
switch (c)
#include <vector>
+
{
#include <iostream>
+
case '1':
#include <algorithm>
+
case '2':
 
+
cout << "Enter the desk size please. (The number must be even and not more than 37.)\n";
 
+
cin >> M;
using namespace std;
+
while (!cin || M % 2 != 0 || M > 37 || M <= 0)
 
+
{
int n,k, o, m, l, g, maxi, a, sum=0,y, mozno=1;//mozno=1 если можно поставить n фигур
+
cout << "Error: wrong desk size. Try again please.\n";
vector<vector<int> > matrix;// двухмерный вектор
+
cin.clear();
 
+
cin.ignore(100, '\n');
bool ladia(int x, int y) {     //проверка, можно ли в эту клетку поставить ладью
+
cin >> M;
    for(int i = 0; i<n; i++)
+
}
        if(matrix[x][i] == 1)
+
cin.ignore(100, '\n');
            return false;
+
cout << "Choose a figure, please.\n p - peshka, k - kon, l - ladya, s - slon, Q - Queen, K - King\n";
    for(int j=0; j<n; j++)
+
char f;
        if(matrix[j][y]==1)
+
cin >> f;
            return false;
+
cin.ignore(100, '\n');
    return true;
+
type t;
}
+
int i;
 
+
do
bool slon(int x, int y) {  //    --//-- слона
+
{
 
+
for (i = 0; i < 6; i++)
  for (int i=x, j=y;i<n && j>=0; i++, j--)
+
{
      if(matrix[i][j] == 1)
+
if (symbols[i] == f)
            return false;
+
{
  for (int i=x, j=y;i>=0 && j>=0; i--, j--)
+
t = type(i);
      if(matrix[i][j] == 1)
+
break;
            return false;
+
}
  for (int i=x, j=y;i>=0 && j<n; i--, j++)
+
}
      if(matrix[i][j] == 1)
+
if (i == 6)
            return false;
+
{
  for (int i=x, j=y;i<n && j<n; i++, j++)
+
cout << "Enter the right letter, you've chosen the wrong one.\n";
      if(matrix[i][j] == 1)
+
cin >> f;
            return false;
+
cin.ignore(100, '\n');
 
+
}
    return true;
+
} while (i == 6);
 
+
if (c == '1')
}
+
{
 
+
cout << "Enter the number of figures please.\n";
bool fruz(int x, int y){      //    --//-- ферзя
+
int N;
    if(slon(x,y) && ladia(x,y))
+
cin >> N;
        return true;
+
while (!cin || N <= 0)
 
+
{
    return false;
+
cout << "Error: wrong argument. Try again please.\n";
 +
cin.clear();
 +
cin.ignore(100, '\n');
 +
cin >> N;
 +
}
 +
cin.ignore(100, '\n');
 +
all_placements(N, t);
 +
}
 +
else
 +
{
 +
cout << "The maximal number of figures is ";
 +
switch (t)
 +
{
 +
case peshka:
 +
cout << M*M/2; break;
 +
case king:
 +
cout << M*M/4; break;
 +
case kon:
 +
cout << (M == 2 ? 4 : M*M/2); break;
 +
case ladya:
 +
cout << M; break;
 +
case slon:
 +
cout << 2*M - 2; break;
 +
case queen:
 +
cout << (M == 2 ? 1 : M);
 +
}
 +
cout << ".\n";
 +
}
 +
break;
 +
case 'q':
 +
cout << endl;
 +
return 0;
 +
default:
 +
cout << "You've chosen the wrong command, try again please.\n";
 +
}
 +
cout << endl << endl;
 +
}
 +
}
 +
</syntaxhighlight>
 +
</div>
  
 +
'''[[Савельева Ольга]]'''
  
}
 
  
bool kon(int x, int y) {  // --//-- коня
+
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей: либо максимальное число вариантов, либо посмотреть наглядно на варианты. Человек вводит размер доски и тип фигуры.
  
  if (x-1>=0 && y-2>=0 && matrix[x-1][y-2]==1)
+
Скачать программу можно  [http://tm.spbstu.ru/:File:Шахматы0001.zip    ]
        return false;
 
  if (y-2>=0 && x+1<n && matrix[x+1][y-2]==1)
 
        return false;
 
  if (x-2>=0 && y-1>=0 && matrix[x-2][y-1]==1)
 
        return false;
 
  if (x+2<n && y-1>=0 && matrix[x+2][y-1]==1)
 
        return false;
 
  if (x-2>=0 && y+1<n && matrix[x-2][y+1]==1)
 
        return false;
 
  if (x+2<n && y+1<n && matrix[x+2][y+1]==1)
 
        return false;
 
  if (x-1>=0 && y+2<n && matrix[x-1][y+2]==1)
 
        return false;
 
  if (x+1<n && y+2<n && matrix[x+1][y+2]==1)
 
        return false;
 
return true;
 
}
 
  
bool king(int x, int y) {  // --//--  короля
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  
    if (x-1>=0 && y-1>=0 && matrix[x-1][y-1]==1)
+
#define windows
        return false;
 
    if (x-1>=0 && matrix[x-1][y]==1)
 
        return false;
 
    if (y+1<n && x-1>=0 && matrix[x-1][y+1]==1)
 
        return false;
 
    if (y+1<n && matrix[x][y+1]==1)
 
        return false;
 
    if (y+1<n && x+1>n && matrix[x+1][y+1]==1)
 
        return false;
 
    if (x+1<n && matrix[x+1][y]==1)
 
        return false;
 
    if (x+1<n && y-1>=0 && matrix[x+1][y-1]==1)
 
        return false;
 
    if (y-1>=0 && matrix[x][y-1]==1)
 
        return false;
 
    return true;
 
  
}
+
#include <stdio.h>
 +
#include <vector>
  
int mass() { // вывод доски на экран
+
#ifdef windows
 +
#include <windows.h>
 +
#endif // windows
  
for(int i = 0; i<n; i++)
+
using namespace std;
  {
 
  
    for(int j = 0; j<n; j++)
+
#ifdef windows
        cout<<matrix[i][j]<<" ";
+
HANDLE hCon;
 
+
#endif // windows
        cout<<endl;
 
    }
 
  
 +
unsigned fact(int n)  //factorial of a number
 +
{
 +
    unsigned long long ret = 1;
 +
    for(int i = 2; i <= n; i++)
 +
        ret *= i;
 +
    return ret;
 
}
 
}
  
int del() // очистка доски(все нули)
+
struct desk
 
+
{
for (int i=0; i<n; i++) {
+
    char **deskFigures, **deskOccupy;  //desk with figures, desk with occupation counter for each cell
 
+
    int x, y, size, a, f;  //pointer position(x, y), size of the desk, amount of prints, amount of figures
    for (int j=0; j<n; j++)
+
    vector<pair<int, int> > *s; //stack of placed figures
        matrix[i][j]=0;
+
    bool stackIsUsed;  //if stack is needed
}
+
    desk(int size, bool stackIsUsed = true):x(0), y(0), size(size), a(0), f(0), stackIsUsed(stackIsUsed)
 
+
    {
}
+
        deskFigures = new char*[size];
 
+
        for(int i = 0; i < size; i++)
 
+
            deskFigures[i] = new char[size];
 
+
        deskOccupy = new char*[size];
void vsevarintyrasstavitnfigur(int x,int y)// рекурсивный поиск всех вараинтов расстановок заданнного количества фигур (x - номер фигуры в доске, если ее растянуть в линию, y - кол-во фигур)
+
        for(int i = 0; i < size; i++)
     if(y==0) {
+
            deskOccupy[i] = new char[size];
         if (a==1){
+
        if(stackIsUsed)
             mass();
+
            s = new vector<pair<int, int> >;
             cout<<'\n';
+
        clear();
 +
    }
 +
    ~desk()
 +
    {
 +
        for(int i = 0; i < size; i++)
 +
            delete deskFigures[i];
 +
        delete deskFigures;
 +
        for(int i = 0; i < size; i++)
 +
            delete deskOccupy[i];
 +
        delete deskOccupy;
 +
        if(stackIsUsed)
 +
            delete s;
 +
    }
 +
    void setKnight(int x, int y, int z) //increase all cells occupied by knight at (x, y) on z
 +
     {
 +
         if(x + 2 < size)
 +
        {
 +
             if(y - 1 >= 0)
 +
                deskOccupy[x + 2][y - 1] += z;
 +
             if(y + 1 < size)
 +
                deskOccupy[x + 2][y + 1] += z;
 
         }
 
         }
         if(a==2) {
+
         if(y + 2 < size)
                 mozno = 1; //mozno=1 если можно поставить n фигур
+
        {
 
+
            if(x - 1 >= 0)
 +
                deskOccupy[x - 1][y + 2] += z;
 +
            if(x + 1 < size)
 +
                deskOccupy[x + 1][y + 2] += z;
 +
        }
 +
        if(x - 2 >= 0)
 +
        {
 +
            if(y - 1 >= 0)
 +
                 deskOccupy[x - 2][y - 1] += z;
 +
            if(y + 1 < size)
 +
                deskOccupy[x - 2][y + 1] += z;
 +
        }
 +
        if(y - 2 >= 0)
 +
        {
 +
            if(x - 1 >= 0)
 +
                deskOccupy[x - 1][y - 2] += z;
 +
            if(x + 1 < size)
 +
                deskOccupy[x + 1][y - 2] += z;
 
         }
 
         }
 
        return;
 
    }
 
 
    for(int i=x;i<n*n;i++){
 
 
        if (o==1)
 
        if(fruz(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
 
 
        if (o==2)
 
        if(ladia(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
 
 
        if (o==3)
 
        if(slon(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
 
 
        if (o==4)
 
        if(kon(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
 
 
        if (o==5)
 
        if(king(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
 
 
 
        vsevarintyrasstavitnfigur(i+1, y);
 
        matrix[i/n][i%n]=0;//удаление фигуры из прошлой клетки для проверки других вариантов
 
        y++;
 
 
 
     }
 
     }
 
+
    void setBishop(int x, int y, int z) //increase all cells occupied by bishop at (x, y) on z
}
+
     {
 
+
        for(int ix = 0, iy1 = y - x, iy2 = y + x; ix < size; ix++, iy1++, iy2--)
void maxfig()//поиск максимального количества фигур
+
            if(ix != x)
     int i=0;
+
            {
while(mozno==1){ //проверяет для данной доски возможность расставить 1,2... фигуры, пока не доходит до количества, которое расставить невозхможно. Тогда это количество фигур -1 - искомая величина
+
                if((iy1 >= 0)and(iy1 < size))
        i++;
+
                    deskOccupy[ix][iy1] += z;
        mozno=0;
+
                if((iy2 >= 0)and(iy2 < size))
        vsevarintyrasstavitnfigur(0,i);
+
                    deskOccupy[ix][iy2] += z;
 +
            }
 
     }
 
     }
     setlocale(LC_ALL, "Russian");
+
     void setRook(int x, int y, int z)   //increase all cells occupied by rook at (x, y) on z
    cout<<"Максимальное количество фигур = "<<i-1<<endl;
+
     {
}
+
         for(int i = 0; i < size; i++)
 
+
        {
 
+
             if(i != x)
int main() {
+
                deskOccupy[i][y] += z;
setlocale(LC_ALL, "Russian");
+
             if(i != y)
     g=0;
+
                deskOccupy[x][i] += z;
    cout<<"Введите размер доски:"<<endl;
 
    cin >>n;
 
         for(int i=0; i<n; i++) {
 
             vector<int> z;
 
            for(int j=0; j<n; j++){
 
                    z.push_back(0);   //создание вектора z  из n нулей и добавление его к двухмерному вектору
 
             }
 
            matrix.push_back(z);
 
 
         }
 
         }
 
+
    }
        cout<<"1 - расстановки фигур на доске n*n"<<endl<<"2 - максимум фигур на доске n*n"<<endl;
+
    void setKing(int x, int y, int z)  //increase all cells occupied by king at (x, y) on z
          cin>>a;
+
    {
 
+
         for(int ix = x - 1; ix <= x + 1; ix++)
         while(2>1){
+
             for(int iy = y - 1; iy <= y + 1; iy++)
            cout<<" 1 - ферзь"<<endl;
+
                if((ix >= 0)and(ix < size)and(iy >= 0)and(iy < size)and((ix != 0)or(iy != 0)))
             cout<<" 2 - ладья"<<endl;
+
                     deskOccupy[ix][iy] += z;
            cout<<" 3 - слон"<<endl;
+
    }
            cout<<" 4 - конь"<<endl;
+
    void setFigure(int x, int y, int z, char figure)   //increase all cells occupied by figure
            cout<<" 5 - король"<<endl;
+
                                                        //and (x, y) on z
            cout<<" 6 - выход"<<endl;
+
     {
 
+
        deskOccupy[x][y] += z;
          cout<<"Введите число от 1 до 6:"<<endl;
+
        switch(figure)
          cin>>o;
+
        {
            mozno=1;
+
            case 'N':
            if(o==6) break;
+
                setKnight(x, y, z);
 
+
                break;
 
+
            case 'B':
 
+
                setBishop(x, y, z);
 
+
                break;
 
+
            case 'R':
 
+
                 setRook(x, y, z);
    if (o==1)   {
+
                 break;
                cout<<"Ферзь"<<endl;
+
            case 'Q':
 
+
                 setBishop(x, y, z);
            if(a==1)
+
                setRook(x, y, z);
                {
+
                break;
                     cin>>y;
+
            case 'K':
                    vsevarintyrasstavitnfigur(0,y);
+
                setKing(x, y, z);
                }
+
                break;
 
+
        }
 
+
    }
            if (a==2)
+
    bool putFigure(int x, int y, char figure)  //place figure on desk and update occupied cells
                maxfig();
+
    {
 
+
        if(deskFigures[x][y] > 0)
                }
+
            return false;
 
+
        deskFigures[x][y] = figure;
 
+
        if(stackIsUsed)
 
+
            s -> push_back(make_pair(x, y));
 
+
        setFigure(x, y, 1, figure);
 
+
        f++;
 
+
        return true;
     if (o==2)  {
+
    }
                cout<<endl<<"Ладья"<<endl;
+
    int cellsLeft() //amount of cells after pointer
 
+
    {
                    if(a==1)
+
        return (size - y) * size - x;
                    {
+
    }
 
+
     bool putNextFree(char figure//attempt to put figure on the next free(and not occupied) place
                        cin>>y;
+
    {
                        vsevarintyrasstavitnfigur(0,y);
+
        if(y >= size)
                    }
+
            return false;
 
+
        while(deskOccupy[x][y] > 0)
                    if (a==2)
+
        {
                        maxfig();
+
            if(++x == size)
 
+
            {
                 }
+
                if(++y == size)
 
+
                    return false;
 
+
                 x = 0;
    if (o==3)   {
 
                 cout<<endl<<"Слон"<<endl;
 
 
 
                 if(a==1)
 
                    {
 
                    cin>>y;
 
                    vsevarintyrasstavitnfigur(0,y);
 
                    }
 
 
 
                    if (a==2)
 
                    maxfig();
 
 
 
                }
 
 
 
 
 
    if (o==4) {
 
                cout<<endl<<"Конь"<<endl;
 
 
 
                if(a==1)
 
                    {
 
                    cin>>y;
 
                    vsevarintyrasstavitnfigur(0,y);
 
                    }
 
                    if (a==2)
 
                    maxfig();
 
 
 
              }
 
 
 
     if (o==5)  {
 
                cout<<"Король"<<endl;
 
 
 
                if(a==1)
 
                {
 
                    cin>>y;
 
                    vsevarintyrasstavitnfigur(0,y);
 
 
 
                }
 
                if (a==2)
 
 
 
                      maxfig();
 
 
 
                 }
 
 
 
 
             }
 
             }
}
+
        }
 
+
        return putFigure(x, y, figure);
 
+
    }
</syntaxhighlight>
+
    void removeFigure(int x, int y) //remove figure from (x, y)
</div>
 
 
 
'''[[Тимошенко Валентина]]'''
 
 
 
'''Краткое описание алгоритма''': доска представлена в виде динамического массива, при выводе на экран пустые клетки обозначаются точками, а клетки, заполненные фигурами, обозначаются буквами (каждая буква соответствует первой букве названия фигуры на английском языке). Для каждой фигуры написаны функции проверки на возможность установки фигуры и функции расстановки. Кроме того, программа аналитически считает максимальное количество фигур для доски заданного пользователем размера и, при наличии команды пользователя, выводит все возможные расстановки рассчитанного максимального количества фигур на экран.
 
 
 
'''Инструкция''': при запуске программа предлагает пользователю ввести размер доски, при этом число должно быть четным (если же пользователь вводит нечетное число, программа предлагает ввести размер еще раз, и так до тех пор, пока не будет введено четное число). Далее пользователь выбирает режим работы программы - либо расстановка фигур, либо расчет максимального количества фигур. В режиме расстановки фигур программа предлагает выбрать тип фигуры, выводит максимальное число фигур для доски заданного размера и предлагает ввести желаемое число фигур для расстановки (если оно больше максимального, предлагается повторная попытка ввода). В режиме расчета максимального числа программа предлагает выбрать тип фигуры, выводит рассчитанное число и задает вопрос о необходимости вывода всех возможных расстановок максимального количества для данной фигуры. Оба режима работают (т.е. все запросы повторяются) до тех пор, пока пользователь не даст команду на завершение цикла. Кроме того, в программе есть возможность изменения размера доски после выхода из всех циклов. При положительном ответе пользователя и изменении размера доступны оба режима работы.
 
 
 
Скачать можно  [http://tm.spbstu.ru/Файл:Chessboard.zip здесь].
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
 
 
#include <iostream> ///расстановка одинаковых шахматных фигур одного цвета на доске произвольного размера так, чтобы они друг друга не били
 
#include <cstring>
 
#include <cstdlib>
 
#include <ctime>
 
 
 
using namespace std;
 
int result_count = 0; ///переменная, в которую закладывается номер варианта расстановки фигур
 
int N; ///то количество фигур для расстановки, которое задает пользователь
 
int **Board; ///двумерный массив для отображения шахматной доски
 
int M; /// размер шахматной доски
 
 
 
///Функция вывода доски
 
void showBoard(string F) ///данная функция отображает доску
 
{
 
    for(int i = 0; i < M; ++i) /// цикл, прогоняющий значения по строкам
 
 
     {
 
     {
         for(int j = 0; j < M; ++j) /// цикл, прогоняющий значения по столбцам
+
         if(deskFigures[x][y]!=0)
             cout << ((Board[i][j]) ? F : "."); ///заполнение как строки, так и столбца символом, который обозначает позицию на шахматной доске
+
             setFigure(x, y, -1, deskFigures[x][y]);
         cout << endl;                         ///точка - если данная клетка пустая, буква - если в клетке стоит соответствующая фигура
+
         deskFigures[x][y] = 0;
 +
        f--;
 
     }
 
     }
     cout << "Result # " << ++result_count << "\n\n"; ///вывод номера варианта расположения с последующим переходом на новую строку
+
     void removeBishop(int diag, bool color, bool left)  //remove bishop
     return;
+
     {
}
+
        if(color)  //true - white, false - black
 
+
        {
///Функции проверки и установки для ферзя
+
            if(diag > 0)    //diag - number of diagonal
 
+
            {
bool tryQueen(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
+
                int diff = left ? 0 : diag * 2;
{
+
                removeFigure(diff, diag * 2 - diff);
    for (int i = 0; i < M; ++i) ///проверка единственности ферзя в строке
+
                removeFigure(size - diff - 1, size - diag * 2 + diff - 1);
    {
+
            }
        if(Board[a][i])
+
            else
             return false;
+
            if(left)   //determine position of the bishop on the diagonal
 +
                removeFigure(0, 0);
 +
            else
 +
                removeFigure(size - 1, size - 1);
 +
        }
 +
        else
 +
        {
 +
            if(diag > 0)
 +
            {
 +
                int diff = left ? 0 : diag * 2;
 +
                removeFigure(size - diff - 1, diag * 2 - diff);
 +
                removeFigure(diff, size - diag * 2 + diff - 1);
 +
            }
 +
            else
 +
            if(left)
 +
                removeFigure(0, size - 1);
 +
             else
 +
                removeFigure(size - 1, 0);
 +
        }
 
     }
 
     }
 
+
     void putBishop(int diag, bool color, bool left) //place bishop
     for(int i = 0; i < M; ++i) ///проверка единственности ферзя в столбце
 
 
     {
 
     {
         if(Board[i][b])
+
         if(color)
             return false;
+
        {
 +
            if(diag > 0)
 +
            {
 +
                int diff = left ? 0 : diag * 2;
 +
                putFigure(diff, diag * 2 - diff, 'B');
 +
                putFigure(size - diff - 1, size - diag * 2 + diff - 1, 'B');
 +
            }
 +
            else
 +
            if(left)
 +
                putFigure(0, 0, 'B');
 +
            else
 +
                putFigure(size - 1, size - 1, 'B');
 +
        }
 +
        else
 +
        {
 +
            if(diag > 0)
 +
             {
 +
                int diff = left ? 0 : diag * 2;
 +
                putFigure(size - diff - 1, diag * 2 - diff, 'B');
 +
                putFigure(diff, size - diag * 2 + diff - 1, 'B');
 +
            }
 +
            else
 +
            if(left)
 +
                putFigure(0, size - 1, 'B');
 +
            else
 +
                putFigure(size - 1, 0, 'B');
 +
        }
 
     }
 
     }
 
+
     void swapBishops(int diag, bool color, bool left)   //move pair bishops to another borders
     for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вверх
 
 
     {
 
     {
         if(Board[a-i][b-i])
+
         removeBishop(diag, color, left);
            return false;
+
        putBishop(diag, color, not(left));
 
     }
 
     }
 
+
     void figureBefore() //remove one figure from stack and change pointer to the next position after figure was placed
     for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вниз
 
 
     {
 
     {
         if(Board[a+i][b+i])
+
         pair<int, int> c = s -> back();
            return false;
+
        s -> pop_back();
    }
+
        x = c.first;
 
+
        y = c.second;
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вниз
+
        removeFigure(x, y);
    {
+
         if(++x == size)
         if(Board[a+i][b-i])
+
        {
             return false;
+
            x = 0;
 +
             y++;
 +
        }
 
     }
 
     }
 
+
     void clear()   //clear the desk
     for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вверх
 
 
     {
 
     {
         if(Board[a-i][b+i])
+
         for(int ix = 0; ix < size; ix++)
             return false;
+
            for(int iy = 0; iy < size; iy++)
 +
            {
 +
                deskFigures[ix][iy] = 0;
 +
                deskOccupy[ix][iy] = 0;
 +
            }
 +
        x = 0;
 +
        y = 0;
 +
        if(stackIsUsed)
 +
             s -> empty();
 +
        f = 0;
 
     }
 
     }
 
+
     void show() //show the desk
     return true; ///если в ходе проверки ферзей и угроз не обнаружилось, в данную клетку можно поставить фигуру
 
}
 
 
 
void setQueen(int a, int count) ///функция расстановки ферзей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
 
{
 
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
 
 
     {
 
     {
         if(tryQueen(a, b)) ///проверка данной клетки на возможность установки фигуры
+
         a++;
         {
+
        printf("%i:\n", a);
            Board[a][b] = 1; ///установка ферзя в первую клетку поля, присваивание ей значения 1 (true)
+
        #ifdef windows
 
+
        unsigned background = 4;
             for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
+
         #else
                 setQueen(i,count+1);
+
        printf("\x1b[31m");
 
+
        char background = 47;
            if(count+1 == N) /// если нужное количество фигур поставлено, то
+
        #endif  //windows
                 showBoard("Q"); /// вызов функции вывода шахматной доски на экран
+
        for(int y = 0; y < size; y++)
 
+
             for(int x = 0; x < size; x++)
            Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
+
            {
        }
+
                #ifdef windows
 +
                SetConsoleTextAttribute(hCon, background);
 +
                #else
 +
                printf("\x1b[%dm", background);
 +
                #endif  //windows
 +
                if(deskFigures[x][y] == 0)
 +
                    putchar(' ');
 +
                else
 +
                    putchar(deskFigures[x][y]);
 +
                #ifdef windows
 +
                if(x < size - 1)
 +
                    background = background == 4 ? 116 : 4;
 +
                else
 +
                 {
 +
                    SetConsoleTextAttribute(hCon, 7);
 +
                    putchar('\n');
 +
                }
 +
                #else
 +
                if(x < size - 1)
 +
                    background = background == 47 ? 40 : 47;
 +
                else
 +
                 {
 +
                    printf("\x1b[0m\n");
 +
                    if(y < size - 1)
 +
                        printf("\x1b[31m");
 +
                }
 +
                #endif // windows
 +
            }
 
     }
 
     }
}
+
};
  
///Функции проверки и установки для ладьи
+
int m = -1; //0 for number of arrangements, 1 for all variants
  
bool tryRook(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
+
unsigned lookForFigure(int size, int amount, char figure, bool show = true) //brute-force
 
{
 
{
     for (int i = 0; i < M; ++i) ///проверка единственности ладьи в строке
+
     desk *d  = new desk(size);
    {
+
     unsigned ret = 0;
        if(Board[a][i])
+
     while((d -> f > 0)or(d -> cellsLeft() >= amount))
            return false;
+
         if(not(d -> putNextFree(figure)))
     }
 
 
 
    for(int i = 0; i < M; ++i) ///проверка единственности ладьи в столбце
 
     {
 
        if(Board[i][b])
 
            return false;
 
    }
 
 
 
    return true; ///если в ходе проверки ладей и угроз не обнаружилось, в данную клетку можно поставить фигуру
 
}
 
 
 
void setRook(int a, int count) ///функция расстановки ладей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
 
{
 
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
 
    {
 
         if(tryRook(a, b)) ///проверка данной клетки на возможность установки фигуры
 
 
         {
 
         {
             Board[a][b] = 1; ///установка ладьи в первую клетку, присваивание ей значения 1 (true)
+
             if(d -> f == amount)
 
+
             {
             for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
+
                 if(show)
                 setRook(i,count+1);
+
                    d -> show();
 
+
                 ret++;
            if(count+1 == N) /// если нужное количество фигур поставлено, то
+
            }
                 showBoard("R"); /// вызов функции вывода шахматной доски на экран
+
             d -> figureBefore();
 
 
             Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 
 
         }
 
         }
     }
+
     delete d;
 +
    return ret;
 
}
 
}
  
///Функции проверки и установки для слона
+
void lookForKnight(int size, int amount)   //arrangements of knights
 
 
bool tryEl(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
 
{
 
{
     for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вверх
+
     if(m == 0)
 
     {
 
     {
         if(Board[a-i][b-i])
+
        printf("Amount of arrangements: ");
             return false;
+
         if(size == 2)
 +
             printf("1\n");
 +
        else
 +
        if(size == 4)
 +
            printf("6\n");
 +
        else
 +
            printf("2\n");
 
     }
 
     }
 
+
     else
     for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вниз
 
 
     {
 
     {
         if(Board[a+i][b+i])
+
         desk *d = new desk(size);
             return false;
+
        if(size == 2)
 +
        {
 +
            d -> putFigure(0, 0, 'N');
 +
            d -> putFigure(0, 1, 'N');
 +
            d -> putFigure(1, 0, 'N');
 +
            d -> putFigure(1, 1, 'N');
 +
            d -> show();
 +
        }
 +
        else
 +
        if(size==4)
 +
            lookForFigure(size, amount, 'N');
 +
        else
 +
        {
 +
            for(int x = 0; x < size; x++)
 +
                for(int y = 0;y < size; y++)
 +
                    if(x + y % 2 == 0)
 +
                        d -> putFigure(x, y, 'N');
 +
            d -> show();
 +
            d -> clear();
 +
            for(int x = 0; x < size; x++)
 +
                for(int y = 0;y < size; y++)
 +
                    if(x + y % 2 == 1)
 +
                        d -> putFigure(x, y, 'N');
 +
             d -> show();
 +
        }
 
     }
 
     }
 +
}
  
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вниз
+
void lookForBishop(int size, int amount)   //arrangements of bishops
    {
+
{
        if(Board[a+i][b-i])
+
    if(m == 0)
            return false;
+
        printf("Amount of arrangements: %u", (unsigned) 1 << size);
    }
+
    else
 
 
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вверх
 
 
     {
 
     {
         if(Board[a-i][b+i])
+
         desk *d = new desk(size, false);
             return false;
+
        bool *b = new bool[size];
 +
        for(int dw = 0; dw < size/2; dw++)
 +
        {
 +
            d -> putBishop(dw, true, false);
 +
            d -> putBishop(dw, false, false);
 +
        }
 +
        int p = size - 1;
 +
        for(;;)
 +
        {
 +
            d -> show();
 +
            while(b[p])
 +
            {
 +
                d -> swapBishops(p % (size / 2), p < size / 2, true);
 +
                b[p--] = false;
 +
                if(p < 0)
 +
                    return;
 +
            }
 +
            b[p] = true;
 +
            d -> swapBishops(p % (size / 2), p < size / 2, false);
 +
             p = size - 1;
 +
        }
 
     }
 
     }
 +
}
  
     return true; ///если в ходе проверки слонов и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
void lookForRook(int size, int amount)  //arrangements of rooks
 +
{
 +
     if(m == 0)
 +
        printf("Amount of arrangements: %u", fact(size));
 +
    else
 +
        lookForFigure(size, amount, 'R');
 
}
 
}
void setEl(int dia, int count) ///функция расстановки слонов; line - очередная строка, count - счетчик количества фигур, которое необходимо расставить
+
 
 +
void lookForQueen(int size, int amount) //arrangements of queens
 
{
 
{
     ///dia - очередная диагональ, которую нужно исследовать на наличие фигуры и угрозы
+
     if(m == 0)
     int a, b; ///клетка, с которой начинается расстановка, a- очередная строка, b- очередной столбец
+
        printf("Amount of arrangements: %u", lookForFigure(size, amount, 'Q', false));
 +
     else
 +
        lookForFigure(size, amount, 'Q');
 +
}
 +
 
 +
void lookForKing(int size, int amount)  //arrangements of kings
 +
{
 +
    if(m == 0)
 +
        printf("Amount of arrangements: %u", lookForFigure(size, amount, 'K', false));
 +
    else
 +
        lookForFigure(size, amount, 'K');
 +
}
  
     if (dia < M) ///условие, что клеткa данной диагонали лежат на доске
+
int main()
 +
{
 +
    int s = -1, f = -1; //s - size, f - figure
 +
    #ifdef windows
 +
     hCon = GetStdHandle(STD_OUTPUT_HANDLE);
 +
    #endif // windows
 +
    sizeInput:
 +
    printf("Enter size of the desk:\n");
 +
    scanf("%i", &s);
 +
    if((s<=0)or(s%2!=0))
 
     {
 
     {
         a = dia; ///начало отсчёта диагоналей, цикл движется по строке
+
         printf("Size must be above 0 and even\n");
         b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
+
         goto sizeInput;
 
     }
 
     }
  else ///если клеткa данной диагонали выходит за размер доски (когда цикл по строке доберется до конца
+
    modeInput:
    {
+
    printf("Enter mode:\n\t0: Print amount of results\n\t1: Print all results\n");
        a = M-1; ///самая последняя диагональ
+
    scanf("%i", &m);
        b =(dia % M)+1; ///соответственно расчёт переменной для столбца этой диагонали
+
     if((m<0)or(m>1))
    }
 
 
 
     for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам снизу слева вправо вверх
 
 
     {
 
     {
         int line = a-i; ///строковая координата данной клетки диагонали
+
         printf("Mode can be 0 or 1\n");
         int column = b+i; ///столбцовая координата данной клетки диагонали
+
         goto modeInput;
 
+
    }
        if(tryEl(line, column))/// проверка на единственность слона по диагоналям
+
    figureInput:
         {
+
    printf("Enter figures to be placed\n\t0: Knight (N)\n\t1: Bishop (B)\n\t2: Rook (R)\n\t3: Queen (Q)\n\t4: King (K)\n");
             Board[line][column]=1; ///установка слона в первую клетку, присваивание ей значения 1 (true)
+
    scanf("%i", &f);
 
+
    if((f<0)or(f>4))
             for(int i = dia + 1; i<2*M-1; ++i) ///расстановка указанного пользователем количества фигур
+
    {
                setEl(i,count+1);
+
        printf("Figure number ranges from 0 to 4\n");
 
+
         goto figureInput;
             if(count+1 == N) /// если нужное количество фигур поставлено, то
+
    }
                 showBoard("E"); /// вызов функции вывода шахматной доски на экран
+
    switch(f)
 
+
    {
             Board[line][column]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
+
        case 0:
        }
+
             if(s==2)
 +
                lookForKnight(s, 4);
 +
            else
 +
                lookForKnight(s, s *s / 2);
 +
            break;
 +
        case 1:
 +
             lookForBishop(s, 2 * s - 2);
 +
            break;
 +
        case 2:
 +
            lookForRook(s, s);
 +
            break;
 +
        case 3:
 +
             if(s==2)
 +
                lookForQueen(s, 1);
 +
            else
 +
                 lookForQueen(s, s);
 +
            break;
 +
        case 4:
 +
             lookForKing(s, (s / 2) * (s / 2));
 +
            break;
 
     }
 
     }
 +
    return 0;
 
}
 
}
  
///Функции проверки и установки для коня
 
  
bool tryHorse(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
    ///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 5х5 вокруг установленной фигуры
 
  
    if ((a-1) >=0 && (b-2)>=0 && Board[a-1][b-2])
+
</syntaxhighlight>
        return false;
+
</div>
 +
 
  
    if ((a-1)>=0 && (b+2) < M && Board[a-1][b+2])
+
'''[[Сенников Иван]]'''
        return false;
 
  
    if ((a+1) < M && (b-2) >=0 && Board[a+1][b-2])
+
'''Суть программы:''' Программа позволяет на шахматной доске MxM расставить N фигур K типа всевозможными способами, причем при этом производится расчет максимального количества фигур K типа, которые можно расставить на данной доске MxM.
        return false;
 
  
    if ((a+1) < M && (b+2) < M && Board[a+1][b+2])
+
'''Идея:''' Шахматная доска представляет собой двумерный динамический массив. С помощью рекурсивного метода программа пробегает по массиву, проверяя клетки доски по всем направлениям на то, атакованы ли они другими фигурами этого типа. В зависимости от количества поставленных фигур изменяется количество итераций. В новую клетку ставиться новая фигура и так до тех пор, пока не выполнится написанное выше условие, после чего начнется обратный ход.
        return false;
 
  
    if ((a-2) >=0 && (b-1) >=0 && Board[a-2][b-1])
+
'''Инструкция:''' Программа написана в виде меню на английском языке: пользователю будет предоставлена возможность сначала обозначить размер доски, а после выбрать тип фигур и их количество для дальнейшей работы с ними. Комментарии к программе написаны также на английском языке.
        return false;
 
  
    if ((a-2) >=0 && (b+1) < M && Board[a-2][b+1])
+
Ссылка для скачиваний: [http://tm.spbstu.ru/Файлы:Chess_v2.0.zip здесь].
        return false;
 
  
    if ((a+2) < M && (b-1) >= 0 && Board[a+2][b-1])
 
        return false;
 
  
    if ((a+2) < M && (b+1) < M && Board[a+2][b+1])
+
'''[[Козловская Анна]]'''
        return false;
 
  
    return true; ///если в ходе проверки коней и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
'''Краткое описание алгоритма:''' Доска представлена в виде динамического массива[m;m], при выводе на экран пустые клетки обозначаются звездочками,а клетки, заполненные фигурами-буквами(каждая буква соответствует первой букве названия фигуры на английском языке). Для всех фигур написаны алгоритмы проверки на возможность расстановки фигуры. После выбора типа фигуры,используется рекурсивная функция,которая проверяет возможные расстановки через данную функцию проверки ,для данного типа фигуры. Во втором варианте работы программы,она аналитически высчитывает максимально возможное количество заданных фигур на доске.В программу встроена функция,проверяющая доску на повторные и симметричные относительно всех осей симметрии способы расстановки фигур.
}
 
  
void setHorse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
+
'''Инструкция:''' В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры и кол-во фигур(для первого типа работы программы).Если он выбирает первый вариант работы программы  - вывод всех различных расстановок N фигур.Другой вариант работы программы максимальное число расстановок- программа выводит их количество.
{
 
    if(count==N) /// если нужное количество фигур поставлено, то
 
    {
 
        showBoard("H");  /// вызов функции вывода шахматной доски на экран
 
    }
 
  
    if (a == M) ///условие необходимо; прогоняет алгоритм по всем строкам
+
Скачать можно  [http://tm.spbstu.ru/File:Chess3.rar тут].
        return;
 
  
    for (int j=b; j<M; ++j) ///установка коней в первой строке
 
    {
 
        if(tryHorse(a, j)) ///проверка данной клетки на возможность установки фигуры
 
        {
 
            Board[a][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
 
            int line = a, b = j+1; ///смещение в строке на одну позицию вправо, переобозначение строки на line
 
  
            if (b == M) ///если данный столбец - самый крайний
+
'''[[Абрамов Игорь]]'''
            {
 
                b = 0; ///обнуление переменной, чтобы использовать ее при заполнении следующей строки
 
                line++;    ///то переход на следующую строку и дальнейшее ее заполнение
 
            }
 
            setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
 
            Board[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 
        }
 
    }
 
  
    for(int i=a+1; i<M; ++i) ///дальнейшее заполнение оставшихся строк
+
'''Алгоритм''': в зависимости от выбранного режима работы, после ввода пользователем необходимой информации о размере поля а также типе расставляемых фигур, запускается основная рекурсивная функция, которая либо подсчитывает все возможные расстановки для заданного числа фигур и выводит их в файл, либо рассчитывает максимально возможное расставляемое число фигур. В первом режиме это происходит путём установки фигуры в свободную клетку и отметки клеток, которые бьются данной фигурой, затем запускается эта же функция для оставшихся клеток и т.д., пока число поставленных фигур не дойдёт до числа, заданного пользователем. Тогда эта расстановка выводится в файл и счётчик числа расстановок увеличивается на единицу. Во втором режиме как только находится расстановка для данного количества фигур, функция завершает свою работу, увеличивается счётчик количества фигур и функция вызывается уже для большего количества фигур, пока не будет найдено максимально возможное расставляемое на данной доске число фигур. 
    {
 
        for (int j=0; j<M; ++j)
 
        {
 
            if(tryHorse(i, j)) ///проверка данной клетки на возможность установки фигуры
 
            {
 
                Board[i][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
 
                int line = i, b = j+1; ///смещение в строке на одну позицию вправо
 
  
                if (b == M) ///если данный столбец - самый крайний
+
'''Инструкция''': В меню пользователю предлагается указать размеры доски, тип расставляемых фигур и режим работы программы. После этого, если был выбран режим вывода всех расстановок, необходимо ввести количество расставляемых фигур, после чего программа выведет на экран количество расстановок, а в файле "output.txt" появятся изображения всех расстановок. При выборе второго режима, на экран будет выведено максимальное число фигур заданного типа, которые можно расставить на данной доске.
                {
 
                    b = 0;
 
                    line++;  ///то переход на следующую строку и дальнейшее ее заполнение
 
                }
 
                setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
 
                Board[i][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
 
            }
 
        }
 
    }
 
}
 
  
///для короля
+
Ссылка для скачивания:[http://tm.spbstu.ru/File:Chess_Abramov.rar]
  
bool tryKing(int a, int b) /// проверка на возможность поставить фигуру в квадрате 3х3, a- очередная строка, b- очередной столбец
+
<br>'''[[Нарядчиков Александр]]'''<br>
{
+
'''Инструкция:''' Запустить программу, следовать указаниям, полученным в меню программы.<br>
  ///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 3х3 вокруг установленной фигуры
+
'''Описание программы:''' Шахматное поле представлено в виде двумерного массив N на M, значения N и M пользователь вводит самостоятельно, память выделяется динамически. Также пользователь выбирает тип и количество фигур на поле. В меню можно выбрать между поиском максимально возможного числа фигур на столе и поиском всех расстановок с дальнейшей записью полей в файл.<br>
 +
'''Описание алгоритма:''' При поиске всех расстановок происходит установка выбранной фигуры в свободную клетку, далее происходит маркирование тех клеток, в которые уже невозможно поставить фигуру данного типа, затем процесс происходит снова(рекурсия) пока на поле не окажется выбранное пользователем число фигур. Под конец данное поле записывается в файл и происходит поиск других возможных расстановок данного типа. В конце получаем файл со всеми вариантами расстановок и их количеством. При поиске наибольшего числа фигур на доске программа ищет расстановку для одной фигуры, затем для двух, если это возможно и т.д. С каждым разом происходит увеличение счетчика количества фигур на поле, тем самым в конце данного алгоритма мы получаем максимально возможное число данного типа фигур на доске данного размера.<br>
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
"'''T04CHESS.CPP'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: T04CHESS.CPP
 +
* LAST UPDATE: 17.01.2016
 +
  */
  
    for(int i = a-1; i <= a+1; ++i) ///проверка по строкам
+
#include "CHESS.h"
    {
 
        for(int j = b-1; j <= b+1; ++j) ///проверка по столбцам
 
        {
 
            if (a>=0 && a < M && b>=0 && b < M && Board[a][b]) ///условие наличия клетки в пределах доски
 
                return false;
 
  
            if ((a+1) < M && (b-1) >=0 && Board[a+1][b-1])
+
/* Main function */
                return false;
+
int main( void )
 +
{
 +
// Переменная, отвечающая за выход из меню
 +
int IsReady = 1;
 +
// Количество строк поля; количество столбцов поля
 +
int N, M;
 +
// Если идет поиск всех расстановок - 0; если идет поиск максимального числа фигур на доске - 1
 +
int IsCount;
 +
// Количество фигур на поле
 +
int Number;
 +
// Тип фигуры; количество разных расстановок; максимальное число фигур на доске
 +
int tmp, count, max_value = 1;
 +
// Создание указателя на тип FILE
 +
FILE *F;
  
            if ((a+1) < M && Board[a+1][b])
+
// Консольное меню
                return false;
+
while (IsReady == 1)
 +
{
 +
cout << "Input figure type:\n1 - castle\n2 - bishop\n3 - knight\n4 - queen\n5 - king\n";
 +
cin >> tmp;
  
            if ((a+1) < M && (b+1) < M && Board[a+1][b+1])
+
cout << "Input number of rows on the field:\n";
                return false;
+
cin >> N;
  
            if ((b+1) < M && Board[a][b+1])
+
cout << "Input number of columns on the field:\n";
                return false;
+
cin >> M;
  
            if ((a-1)>=0 && (b+1) < M && Board[a-1][b+1])
+
// Поле шахмат
                return false;
+
chess desk(N, M);
  
            if ((a-1) >=0 && Board[a-1][b])
+
// Обнуление поля
                return false;
+
desk.Clear();
  
            if ((a-1) >=0 && (b-1)>=0 && Board[a-1][b-1])
+
cout << "Input in what mode do you want to work:\n0 - Searching for all fields variants\n1 - Searching for the maximum number of chessmen\n";
                return false;
+
cin >> IsCount;
  
            if ((b-1) >= 0 && Board[a][b-1])
+
// Если идет поиск всех расстановок
                return false;
+
if (IsCount == 0)
        }
+
{
    }
+
cout << "Input number of chessmen on the field:\n";
 +
cin >> Number;
  
    return true; ///если в ходе проверки королей и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
// Создание файла и его открытие
}
+
fopen_s(&F, "chess.txt", "wt");
 +
if ((type)(tmp + 1) == 2)
 +
fputs("Castles' fields:\n", F);
 +
else if ((type)(tmp + 1) == 3)
 +
fputs("Bishops' fields:\n", F);
 +
else if ((type)(tmp + 1) == 4)
 +
fputs("Knights' fields:\n", F);
 +
else if ((type)(tmp + 1) == 5)
 +
fputs("Quenns' fields:\n", F);
 +
else if ((type)(tmp + 1) == 6)
 +
fputs("Kings' fields:\n", F);
 +
else
 +
{
 +
fputs("Error\n", F);
 +
return 0;
 +
}
 +
// Закрытие файла
 +
fclose(F);
  
void setKing (int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count -  счетчик количества фигур, которое необходимо расставить
+
// Количество разных расстановок
{
+
count = desk.FillField(IsCount, (type)(tmp + 1), 0, 0, Number, 0);
    for (int j=b; j<M; ++j)  ///установка королей в первой строке
 
    {
 
        if(tryKing(a, j)) ///проверка данной клетки на возможность установки фигуры
 
        {
 
            Board[a][j]=1; ///проверка данной клетки на возможность установки фигуры
 
            setKing(count+1,a,j); ///расстановка фигур в первой строке
 
            Board[a][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
 
        }
 
    }
 
  
    for(int i=a+1; i<M; ++i) ///установка фигур в оставшуюся часть шахматной доски по строкам
+
// Открытие файла в режиме повторной записи
    {
+
fopen_s(&F, "chess.txt", "at");
        for (int j=0; j<M; ++j)
+
fprintf(F, "\nNumber of fields: %i", count);
        {
+
// Закрытие файла
            if(tryKing(i, j)) ///проверка данной клетки на возможность установки фигуры
+
fclose(F);
            {
 
                Board[i][j]=1; ///проверка данной клетки на возможность установки фигуры
 
                setKing(count+1,i,j); ///расстановка фигур
 
                Board[i][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 
            }
 
        }
 
    }
 
  
    if(count==N) /// если нужное количество фигур поставлено, то
+
cout << "Done!\nCheck 'chess.txt' to see results\n";
    {
+
}
        showBoard("K");/// вызов функции вывода шахматной доски на экран
 
        return;
 
    }
 
}
 
  
int main()
+
// Если идет поиск максимального числа фигур на доске
{
+
else if (IsCount == 1)
    char s; ///переменная, будет использована в цикле
+
{
    do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
+
while (desk.FillField(IsCount, (type)(tmp + 1), 0, 0, max_value, 0))
    {
+
max_value++;
        do ///цикл для считывания введенного пользователем размера доски
+
cout << "The maximum number of chessmen on the board is " << (max_value - 1) << endl;
        {
+
max_value = 1;
            cout << "Input the size of the board: " << endl; ///ввод размера доски
+
}
            cin >> M;
 
  
            if ( (M%2) == 1) ///цикл, работающий только в том случае, если пользователь введет нечетное число
+
// Если было введено некорректное значение для IsCount
            {
+
else
                cout << '\n' << "The number must be even, so try to input the size again" << '\n' << endl;
+
cout << "Error\n";
            }
+
 
 +
// Продолжение работы с программой
 +
cout << "Press '1' if you want to continue\nPress another number if you want to exit\n";
 +
cin >> IsReady;
  
        }
+
if (IsReady == 1)
        while (M%2 !=0); ///пока пользователь не введет допуcтимое число, цикл не прерывается
+
continue;
 +
else
 +
exit(0);
 +
}
  
        Board = new int*[M];  ///создание двумерного массива для отображения шахматной доски
+
return 0;
        for (int i = 0; i<M; i++)
+
} // End of 'main' function
            Board[i] = new int[M]; ///создание первую строку доски
 
        for (int i = 0; i<M; i++)
 
            for (int j = 0; j<M; j++)
 
                Board[i][j] = 0;  ///зануление массива
 
  
        int V; ///пользователь выбирает один из двух вариантов работы программы
+
// END OF 'T04CHESS.CPP' FILE
        cout << '\n' << "Input your choice: 1=placing of figures, 2=for max amount of figures" << endl;
+
</syntaxhighlight>
        cin >> V;
+
"'''CHESS.CPP'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: CHESS.CPP
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
        if (V==1) ///цикл, расставляющий фигуры по введенным пользователем данным
+
#include "CHESS.H"
        {
 
            char k; ///переменная, будет использована в цикле
 
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
 
            {
 
                int T; ///пользователь выбирает фигуру
 
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
 
                cin >> T;
 
  
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
+
// Количество расстановок
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
+
int Result_count = 0;
                {
 
                    maximum=M;
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                }
 
                if (T==2) ///максимальное количество фигур на заданной доске для короля
 
                {
 
                    maximum=0.25*M*M;
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                }
 
                if (T==3) ///максимальное количество фигур на заданной доске для коня
 
                {
 
                    maximum=0.5*M*M;
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                }
 
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
 
                {
 
                    maximum=M;
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                }
 
                if (T==5) ///максимальное количество фигур на заданной доске для слона
 
                {
 
                    maximum=2*M-2;
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                }
 
  
                do ///цикл, считывающий количество фигур, заданное пользователем
+
/* Clear field function */
                {
+
// Обнуление поля
                    cout << "Input the amount of figures, it must be less than max amount or equals that" << endl;
+
void chess::Clear( void )
                    cin >> N;
+
{
                }
+
// Все клетки свободны
                while (N>maximum);  ///пока пользователь не введет допуcтимое число, цикл не прерывается
+
for (int i = 0; i < N; i++)
 +
for (int j = 0; j < M; j++)
 +
Field[i][j] = Free;
 +
} // End of 'Clear' function
  
                cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
+
/* Check if the cell is available that function */
 
+
// Проверка, свободна и существует ли данная клетка
                if (T==1) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для ферзя
+
int chess::IsAvailable( int x, int y )
                {
+
{
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
+
if (x >= 0 && y >= 0 && x < M && y < N)
                    for (int i=0; i <M; ++i)
+
if (Field[y][x] == Free)
                        setQueen(i,0);
+
  return 1;
                }
+
                if (T==2) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для короля
+
return 0;
                {
+
} // End of 'IsAvailable' function
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                    setKing(0,0,0);
 
                }
 
                if (T==3) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для коня
 
                {
 
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                    setHorse(0,0,0);
 
                }
 
                if (T==4) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для ладьи
 
                {
 
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                    for (int i=0; i <M; ++i)
 
                        setRook(i,0);
 
                }
 
                if (T==5) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для слона
 
                {
 
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                    for(int i = 0; i<2*M-1; ++i)
 
                        setEl(i,0);
 
                }
 
  
                cout << '\n' << "If you want continue placing figures, input +, if not, input -" << endl;
+
/* Output field in file function */
                cin >> k;
+
// Запись одного поля в файл
            }
+
void chess::OutputInFile( void )
            while (k != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
+
{
        }
+
// Создание указателя на тип FILE
 +
FILE *F;
  
        else if (V==2) ///цикл, вычисляющий максимальное количество фигур по введенным пользователем данным
+
// Открытие файла в режиме повторной записи
        {
+
fopen_s(&F, "chess.txt", "at");
            char z; ///переменная, будет использована в цикле
+
 
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
+
// Переход на следующую строку файла
            {
+
fputc('\n', F);
                int T; ///переменная для выбора фигуры пользователем
 
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
 
                cin >> T;
 
                char d;  ///переменная, будет использована в циклах
 
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
 
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
 
                {
 
                    maximum=M; ///формула расчёта максимального количества фигур для заданной доски
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
 
                    cin >> d;
 
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 
                    {
 
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        for (int i=0; i < M; ++i)
 
                            setQueen(i,0);
 
                    }
 
  
                }
+
// Заполнение файла текущем полем
                if (T==2) ///максимальное количество фигур на заданной доске для короля
+
for (int i = 0; i < N; ++i)
                {
+
{
                    maximum=0.25*M*M; ///формула расчёта максимального количества фигур для заданной доски
+
// '*' - свободная клетка; '#' - клетка, которая уже занята
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
for (int j = 0; j < M; ++j)
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
+
(Field[i][j] == Free || Field[i][j] == busy) ? fputc('*', F) : fputc('#', F);
                    cin >> d;
+
// Переход на следующую строку файла
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
+
fputc('\n', F);
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
+
}
                    {
+
 
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
+
// Закрытие файла
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
+
fclose(F);
                        setKing(0,0,0);
+
} /* End of 'OutputInFile' function */
                    }
+
 
                }
+
/* Copy desks function */
                if (T==3) ///максимальное количество фигур на заданной доске для коня
+
// Копирование поля
                {
+
void chess::Copy( chess &desk2 )
                    maximum=0.5*M*M; ///формула расчёта максимального количества фигур для заданной доски
+
{
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
  for (int i = 0; i < N; i++)
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
+
for (int j = 0; j < M; j++)
                    cin >> d;
+
desk2.Field[i][j] = Field[i][j];
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
+
} // End of 'Copy' function
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
+
 
                    {
+
/* Fill field function */
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
+
// Заполнение полей и поиск максимального числа расстановок
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
+
// Chessmen_num - количество фигур, которое нужно поставить; Already_stood - количество, которое уже стоит
                        setHorse(0,0,0);
+
int chess::FillField( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood )
                    }
+
{
                }
+
int i, j, k, l;
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
+
chess desk2(N, M);
                {
+
 
                    maximum=M; ///формула расчёта максимального количества фигур для заданной доски
+
// Обнуление поля
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
desk2.Clear();
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
 
                    cin >> d;
 
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 
                    {
 
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        for (int i=0; i <M; ++i)
 
                            setRook(i,0);
 
                    }
 
                }
 
                if (T==5) ///максимальное количество фигур на заданной доске для слона
 
                {
 
                    maximum=2*M-2; ///формула расчёта максимального количества фигур для заданной доски
 
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
 
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
 
                    cin >> d;
 
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 
                    {
 
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        for(int i = 0; i<2*M-1; ++i)
 
                            setEl(i,0);
 
                    }
 
                }
 
  
                cout << '\n' << "If you want continue counting, input +, if not, input -" << '\n' << endl;
+
// Пробег по всем оставшимся клеткам поля, начиная с той, на которой мы закончили предыдущую итерацию
                 cin >> z;
+
for (i = y; i < N; i++)
             }
+
for (j = ((i == y) ? x : 0); j < M; j++)
             while (z != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
+
{
         }
+
// Если клетка свободна
         cout << '\n' << "If you want to change the size of board, input +, if not, input -" << endl;
+
if (Field[i][j] == Free)
         cin >> s;
+
{
         if (s=='-')
+
// Копируем доску
         {
+
Copy(desk2);
            cout << '\n' << "The program is finished." << '\n' << endl; ///вывод на экран сообщения о завершении работы программы
+
        }
+
// Множественный выбор типа фигуры
    }
+
switch (set)
    while (s != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение, а также на завершение всей программы
+
{
}
+
// Ладья
 
+
case castle:
</syntaxhighlight>
+
for (k = 0; k < N; k++)
</div>
+
{
 
+
// Движение по столбцу
'''[[Уманский Александр]]'''
+
if (desk2.Field[k][j] == Free)
 
+
  desk2.Field[k][j] = busy;
'''Работа программы''': Программа предлагает 2 режима работы 1 режим это нахождение для 1 из 5 фигур таких расстановок L фигур, на доске M*N, что они не бьют друг друга, второй режим возможно найти максимальное число фигур, которое можно расставить на этом поле, чтобы они не били друг друга.
+
// Движение по строке
 
+
if (desk2.Field[i][k] == Free)
'''Идея алгоритма''': Основная идея заключается в присваиванию клетке 1 из 3 значений, пустая клетка, битая клетка или клетка, в которой стоит фигура.
+
  desk2.Field[i][k] = busy;
В точку ставится фигура, дальше маркируются поля, в которые уже невозможно поставить фигуру, затем мы ставим следующую фигуру и снова маркируем поля, в которые не можем ничего поставить и так далее до нужного пользователю числа фигур. Поиск максимального числа это попытка поставить на доску как можно больше фигур, он пользуется алгоритмами первого пункта.
+
}
 +
break;
 +
// Слон
 +
case bishop:
 +
// Выбор и поиск наибольшей существующей на поле диагонали
 +
for (k = 1 - (N < M ? N : M); k < (N < M ? N : M); k++)
 +
{
 +
// Проход из левого верхнего угла до правого нижнего
 +
if (IsAvailable(j + k, i + k))
 +
desk2.Field[i + k][j + k] = busy;
 +
// Проход из левого нижнего до правого верхнего
 +
if (IsAvailable(j + k, i - k))
 +
desk2.Field[i - k][j + k] = busy;
 +
}
 +
break;
 +
// Конь
 +
case knight:
 +
// Ходы коня, k - приращение по X, l - по Y
 +
k = -2, l = 1;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = -2, l = -1;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = -1, l = 2;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = -1, l = -2;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = 1, l = 2;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = 1, l = -2;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = 2, l = 1;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
 +
k = 2, l = -1;
 +
// Проверка возможности хода в данную клетку
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
break;
 +
// Ферзь
 +
case queen:
 +
for (k = 0; k < N; k++)
 +
{
 +
// Движение по столбцу
 +
if (desk2.Field[k][j] == Free)
 +
desk2.Field[k][j] = busy;
 +
// Движение по строке
 +
if (desk2.Field[i][k] == Free)
 +
desk2.Field[i][k] = busy;
 +
}
 +
 +
// Выбор и поиск наибольшей существующей на поле диагонали
 +
for (k = 1 - (N < M ? N : M); k < (N < M ? N : M); k++)
 +
{
 +
// Проход из левого верхнего угла до правого нижнего
 +
if (IsAvailable(j + k, i + k))
 +
desk2.Field[i + k][j + k] = busy;
 +
// Проход из левого нижнего до правого верхнего
 +
if (IsAvailable(j + k, i - k))
 +
desk2.Field[i - k][j + k] = busy;
 +
}
 +
break;
 +
// Король
 +
case king:
 +
  // Проход по квадрату 3 на 3, построенному центром на клетке, в которой стоит король
 +
for (k = -1; k < 2; k++)
 +
for (l = -1; l < 2; l++)
 +
if (IsAvailable(j + k, i + l))
 +
desk2.Field[i + l][j + k] = busy;
 +
break;
 +
}
 +
// Установка фигуры в данную клетку
 +
desk2.Field[i][j] = set;
 +
       
 +
// Проверяем, что количество поставленных фигур, которое равно номеру итерации, меньше чем необходимое число фигур
 +
if ((Already_stood + 1) < Chessmen_num)
 +
{
 +
// Если идет поиск всех расстановок, то запускаем следующий шаг
 +
if (IsCount == 0)
 +
desk2.FillField(IsCount, set, j, i, Chessmen_num, Already_stood + 1);
 +
// Если идет поиск максимального числа фигур на доске и была найдена хотя бы одна расстоновка, то возвращаем 1
 +
else if ((IsCount == 1) && desk2.FillField(IsCount, set, j, i, Chessmen_num, Already_stood + 1))
 +
return 1;
 +
}
 +
 
 +
// Если количество поставленных фигур равно необходимому числу фигур
 +
else if ((Already_stood + 1) == Chessmen_num)
 +
{
 +
// Если идет поиск всех расстановок, то увеличиваем количество расстоновок на одну и записываем поле в файл 
 +
if (IsCount == 0)
 +
{
 +
Result_count++;
 +
  desk2.OutputInFile();
 +
}
 +
// Если идет поиск максимального числа фигур на доске, значит расстановка существует, возвращаем 1
 +
else if (IsCount == 1)
 +
return 1;
 +
  }
 +
}
 +
}
 +
// Если идет поиск всех расстановок, то возвращаем количество расстановок
 +
if (IsCount == 0)
 +
  return Result_count;
 +
// Если идет поиск максимального числа фигур на доске, то возвращаем 0
 +
else if (IsCount == 1)
 +
  return 0;
 +
} // End of 'FillField' function
 +
 
 +
// END OF 'CHESS.CPP' FILE
 +
</syntaxhighlight>
 +
"'''CHESS.H'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: CHESS.H
 +
* LAST UPDATE: 17.01.2016
 +
*/
 +
 
 +
#ifndef __CHESS_H_
 +
#define __CHESS_H_
 +
 
 +
#include <iostream>
 +
#include <conio.h>
 +
 
 +
using namespace std;
 +
 
 +
// свободен, занят, ладья, слон, конь, ферзь, король
 +
enum type { Free, busy, castle, bishop, knight, queen, king };
 +
 
 +
/* Chess class */
 +
class chess
 +
{
 +
private:
 +
// Поле данных фигур
 +
type **Field;
 +
// Количество строк поля; количество столбцов поля
 +
int N, M;
 +
public:
 +
/* Default constructor */
 +
chess( void )
 +
{
 +
N = 8, M = 8;
 +
 +
// Выделение памяти под массив поля
 +
Field = new type*[N];
 +
for (int i = 0; i < N; i++)
 +
Field[i] = new type[M];
 +
}
 +
 +
/* Class constructor */
 +
chess( int _N, int _M ) : N(_N), M(_M)
 +
{
 +
// Выделение памяти под массив поля
 +
Field = new type* [N];
 +
for (int i = 0; i < N; i++)
 +
Field[i] = new type [M];
 +
}
 +
 
 +
/* Class destructor */
 +
~chess( void )
 +
{
 +
// Чистка памяти
 +
for (int i = 0; i < N; i++)
 +
delete[] Field[i];
 +
delete[] Field;
 +
}
 +
 
 +
/* Clear field function */
 +
void Clear( void );
 +
 +
/* Check if the cell is available that function */
 +
int IsAvailable( int x, int y );
 +
 +
/* Output field in file function */
 +
void OutputInFile( void );
 +
 +
/* Copy desks function */
 +
void Copy( chess& desk2 );
 +
 +
/* Fill field function */
 +
int FillField ( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood);
 +
}; // end of 'chess' class
 +
 
 +
#endif /*__CHESS_H_ */
 +
 
 +
// END OF 'CHESS.H' FILE
 +
</syntaxhighlight>
 +
</div>
 +
[http://tm.spbstu.ru/File:T04CHESS.7z Скачать архив]
 +
<br>
 +
 
 +
 
 +
'''[[Рубинова Раиса]]'''
 +
 
 +
'''Основная идея программы''': программа позволяет выводить на экран всевозможные расстановки n однотипных фигур на шахматной доске размером n*n так, чтобы ни одна из фигур не била другую.
 +
 
 +
Скачать можно [http://tm.spbstu.ru/File:nmk.rar тут.]
 +
 
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <iostream>
 +
#include <cstring>
 +
#include <cstdlib>
 +
#include <ctime>
 +
 
 +
using namespace std;
 +
int R = 0; ///переменная, отвечающая за количество вариантов расстановок
 +
int N; ///количество фигур для расстановки, которое задает пользователь
 +
int **B; ///двумерный массив, отображающий шахматную доску
 +
int M; /// размер шахматной доски
 +
 
 +
 
 +
void showBoard() ///функция, выводящая доску на экран
 +
{
 +
    for(int i=0; i<M; ++i) /// строки
 +
    {
 +
        for(int j=0; j<M; ++j)  /// столбцы
 +
            {cout << B[i][j] << " ";} ///заполнение клетки с координатами i;j
 +
        cout << endl;
 +
    }
 +
    cout << "Variant " << ++R << "\n\n"; ///вывод номера варианта расположения с последующим переходом на новую строку
 +
    return;
 +
}
 +
 
 +
bool checkQueen(int a, int b) /// функция, проверяющая, не бьется ли ферзь другим ферзем
 +
{
 +
    for (int i = 0; i < M; ++i) ///проверка строки
 +
    {
 +
        if(B[a][i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 0; i < M; ++i) ///проверка столбца
 +
    {
 +
        if(B[i][b])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///по диагонали влево-вверх
 +
    {
 +
        if(B[a-i][b-i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a+i < M && b+i < M; ++i)///по диагонали вправо-вниз
 +
    {
 +
        if(B[a+i][b+i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a+i < M && b-i >= 0; ++i)///по диагонали влево-вниз
 +
    {
 +
        if(B[a+i][b-i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///по диагонали вправо-вверх
 +
    {
 +
        if(B[a-i][b+i])
 +
            return false;
 +
    }
 +
 
 +
    return true;
 +
}
 +
 
 +
void Queen(int a, int count) ///функция, расстанавливающая ферзи
 +
{
 +
    for(int b = 0; b < M; ++b) /// расстановка по изменению номера столбца
 +
    {
 +
        if(checkQueen(a, b)) ///проверка, бьется ли данная клетка ферзем
 +
        {
 +
            B[a][b] = 1; ///заполнение первой клетки
 +
            for(int i = a+1; i < M; ++i) ///расстановка указанного пользователем количества фигур
 +
                Queen(i,count+1);
 +
            if(count+1==N) /// проверка, расставили ли мы нужное количество фигур
 +
                showBoard();
 +
            B[a][b]=0; ///обнуление переменной
 +
        }
 +
    }
 +
}
 +
 
 +
bool checkRook(int a, int b) /// функция, проверяющая ли данную клетку ладья
 +
{
 +
    for (int i = 0; i < M; ++i) ///проверка строки
 +
    {
 +
        if(B[a][i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 0; i < M; ++i) ///проверка столбца
 +
    {
 +
        if(B[i][b])
 +
            return false;
 +
    }
 +
 
 +
    return true;
 +
}
 +
 
 +
void Rook(int a, int count) ///функция, расстанавливающая ладьи
 +
{
 +
    for(int b = 0; b < M; ++b) /// расстановка по строкам с изменением номера столбца
 +
    {
 +
        if(checkRook(a, b)) ///проверка, бьется ли данная клетка ладьей
 +
        {
 +
            B[a][b] = 1; ///установка ладьи
 +
            for(int i =a+1; i<M; ++i)
 +
                Rook(i,count+1);
 +
            if(count+1 == N) /// проверка, расставили ли мы нужное количество элементов
 +
                 showBoard();
 +
 
 +
            B[a][b]=0; ///обнуление переменной
 +
        }
 +
    }
 +
}
 +
 
 +
bool checkElephant(int a, int b) /// функция, проверяющая, бьется ли данная клетка слоном
 +
{
 +
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка по диагонали влево-вверх
 +
    {
 +
        if(B[a-i][b-i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка по диагонали вправо-вниз
 +
    {
 +
        if(B[a+i][b+i])
 +
            return false;
 +
    }
 +
 
 +
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка по диагонали влево-вниз
 +
    {
 +
        if(B[a+i][b-i])
 +
             return false;
 +
    }
 +
 
 +
    for(int i = 1; a-i >= 0 && b+i < M; ++i) ///проверка по диагонали вправо-вверх
 +
    {
 +
        if(B[a-i][b+i])
 +
             return false;
 +
    }
 +
 
 +
    return true;
 +
}
 +
void Elephant(int dia, int count) ///функция, расстанавливающая слоны
 +
{
 +
    int a, b; /// задача клетки, соответствующекй данной диагонали
 +
    if (dia < M) /// проверка диагонали
 +
    {
 +
        a = dia; /// номер строки - номер диагонали
 +
        b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
 +
    }
 +
  else ///если все диагонали рассмотрены
 +
    {
 +
        a = M-1; /// рассматриваем самую последнюю диагональ
 +
        b =(dia % M)+1; ///рассчитываем координату столбца для данной диагонали
 +
    }
 +
 
 +
    for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам из нижнего левого угла в правый верхний
 +
    {
 +
        int line=a-i; ///координата строки (мы уменьшаем координату строки)
 +
        int column=b+i; ///координата столбца  (но увеличиваем координату столбца)
 +
 
 +
        if(checkElephant(line, column))/// проверка, бьется ли слон по диагонали
 +
        {
 +
            B[line][column]=1; ///установка слона
 +
 
 +
            for(int i=dia+1; i<2*M-1; ++i) ///расстановка фигур, основанная на изменении параметров (номера диагонали и количества рсставленных фигур)
 +
                Elephant(i,count+1);
 +
 
 +
            if(count+1 == N) /// проверка количества расставленных фигур
 +
                showBoard();
 +
 
 +
            B[line][column]=0; ///обнуление переменной
 +
        }
 +
    }
 +
}
 +
 
 +
bool checkHorse(int a, int b) /// функция, проверяющая, бьется ли данная клетка конями
 +
{
 +
    if ((a-1) >=0 && (b-2)>=0 && B[a-1][b-2])
 +
        return false;
 +
 
 +
    if ((a-1)>=0 && (b+2) < M && B[a-1][b+2])
 +
        return false;
 +
 
 +
    if ((a+1) < M && (b-2) >=0 && B[a+1][b-2])
 +
        return false;
 +
 
 +
    if ((a+1) < M && (b+2) < M && B[a+1][b+2])
 +
        return false;
 +
 
 +
    if ((a-2) >=0 && (b-1) >=0 && B[a-2][b-1])
 +
        return false;
 +
 
 +
    if ((a-2) >=0 && (b+1) < M && B[a-2][b+1])
 +
        return false;
 +
 
 +
    if ((a+2) < M && (b-1) >= 0 && B[a+2][b-1])
 +
        return false;
 +
 
 +
    if ((a+2) < M && (b+1) < M && B[a+2][b+1])
 +
        return false;
 +
 
 +
    return true;
 +
}
 +
 
 +
void Horse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
 +
{
 +
    if(count==N) /// проверка количества расставленных фигур
 +
    {
 +
        showBoard();
 +
    }
 +
    if (a == M) /// не выходит ли за предел доски
 +
        return;
 +
    for (int j=b; j<M; ++j) ///рассматриваем первую строку
 +
    {
 +
        if(checkHorse(a, j)) ///проверка
 +
        {
 +
            B[a][j]=1; ///установка коня
 +
            int l = a, b = j+1; ///смещение в другой столбец
 +
 
 +
            if (b == M) ///проверка, не крайний ли это столбец, так как тогда мы не можем продолжать расстановку (мы ее завершили)
 +
            {
 +
                b=0; ///обнуление переменной
 +
                l++;    ///переход на следующую
 +
            }
 +
            Horse(count+1,l,b); ///установка фигуры, увеличение счетчика
 +
            B[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
        }
 +
    }
 +
    for(int i=a+1; i<M; ++i) ///заполнение строк
 +
    {
 +
        for (int j=0; j<M; ++j)
 +
        {
 +
            if(checkHorse(i, j)) ///проверка клетки, не бьется ли она другими конями
 +
            {
 +
                B[i][j]=1; ///установка коня
 +
                int l = i, b = j+1; ///смещаемся на другой столбец
 +
                if (b == M)
 +
                {
 +
                    b = 0;
 +
                    l++;
 +
                }
 +
                Horse(count+1,l,b); ///установка фигуры с увеличением счетчика
 +
                B[i][j]=0;  ///обнуление переменной
 +
            }
 +
        }
 +
    }
 +
}
 +
 
 +
bool checkKing(int a, int b) /// функция, проверяющая, бьет ли данную клетку король
 +
{
 +
    for(int i = a-1; i <= a+1; ++i)
 +
    {
 +
        for(int j = b-1; j <= b+1; ++j)
 +
        {
 +
            if (a>=0 && a < M && b>=0 && b < M && B[a][b])
 +
                return false;
 +
 
 +
            if ((a+1) < M && (b-1) >=0 && B[a+1][b-1])
 +
                return false;
 +
 
 +
            if ((a+1) < M && B[a+1][b])
 +
                return false;
 +
 
 +
            if ((a+1) < M && (b+1) < M && B[a+1][b+1])
 +
                return false;
 +
 
 +
            if ((b+1) < M && B[a][b+1])
 +
                return false;
 +
 
 +
            if ((a-1)>=0 && (b+1) < M && B[a-1][b+1])
 +
                return false;
 +
 
 +
            if ((a-1) >=0 && B[a-1][b])
 +
                return false;
 +
 
 +
            if ((a-1) >=0 && (b-1)>=0 && B[a-1][b-1])
 +
                return false;
 +
 
 +
            if ((b-1) >= 0 && B[a][b-1])
 +
                return false;
 +
        }
 +
    }
 +
 
 +
    return true;
 +
}
 +
 
 +
void King (int count, int a, int b) ///функция, расставляющая коней
 +
{
 +
    for (int j=b; j<M; ++j)  ///установка королей в первой строке
 +
    {
 +
        if(checkKing(a, j)) ///проверка данной клетки на возможность установки фигуры
 +
        {
 +
            B[a][j]=1; ///если по результатам проверки можно поставить фигуру, то мы ее ставим
 +
            King(count+1,a,j); ///расстановка фигур для первой доски
 +
            B[a][j]=0;  ///обнуление переменной
 +
        }
 +
    }
 +
 
 +
    for(int i=a+1; i<M; ++i) ///расстановка фигур
 +
    {
 +
        for (int j=0; j<M; ++j)
 +
        {
 +
            if(checkKing(i, j)) ///проверка данной клетки на возможность установки фигуры
 +
            {
 +
                B[i][j]=1;  /// если короля можно поставить, то ставим его в данную клетку
 +
                King(count+1,i,j);
 +
                B[i][j]=0;  ///обнуление переменной
 +
            }
 +
        }
 +
    }
 +
 
 +
    if(count==N)
 +
    {
 +
        showBoard();/// вывод шахмат на экран
 +
         return;
 +
    }
 +
}
 +
 
 +
int main()
 +
{
 +
        cout << "Enter the size of the board: " << endl; ///ввод размера доски
 +
        cin >> M;
 +
        B = new int*[M];
 +
        for (int i=0; i<M; i++)
 +
            B[i] = new int[M];
 +
        for (int i = 0; i<M; i++)
 +
            for (int j = 0; j<M; j++)
 +
                B[i][j] = 0;
 +
        int Var;
 +
        cout << '\n' << "1=your number of figures, 2=max number of figures" << endl;
 +
        cin >> Var;
 +
         int F;
 +
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
 +
                cin >> F;
 +
         if (Var==1) /// если пользователь выбрал свое количество фигур, то мы выполняем следующие действия:
 +
        {
 +
                int mn;
 +
                    cout << "Input the number of figures" << endl;
 +
                    cin >> N;
 +
                if (F==1)
 +
                {
 +
                    for (int i=0; i <M; ++i)
 +
                        Queen(i,0);
 +
                }
 +
                if (F==2)
 +
                {
 +
                    King(0,0,0);
 +
                }
 +
                if (F==3)
 +
                {
 +
                    Horse(0,0,0);
 +
                }
 +
                if (F==4)
 +
                {
 +
                    for (int i=0; i <M; ++i)
 +
                        Rook(i,0);
 +
                }
 +
                if (F==5)
 +
                {
 +
                    for(int i = 0; i<2*M-1; ++i)
 +
                        Elephant(i,0);
 +
                }
 +
            }
 +
         else if (Var==2)       /// если пользователь выбрал максимальное количество фигур
 +
         {
 +
                int mn;
 +
                if (F==1)
 +
                {
 +
                    mn=M;
 +
                    cout <<  "Max number " << mn  << endl;  /// выводим максимальное количество фигур
 +
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                        for (int i=0; i < M; ++i)
 +
                            Queen(i,0);
 +
                    }
 +
 
 +
                if (F==2)
 +
                {
 +
                    mn=0.25*M*M;
 +
                    cout << '\n' << "Max number " << mn <<  endl;
 +
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                    King(0,0,0);
 +
                    }
 +
                if (F==3)
 +
                {
 +
                    mn=0.5*M*M;
 +
                    cout <<  "Max number " << mn  << endl;
 +
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                    Horse(0,0,0);
 +
                    }
 +
                if (F==4)
 +
                {
 +
                    mn=M;
 +
                    cout <<  "Max number " << mn  << endl;
 +
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                        for (int i=0; i <M; ++i)
 +
                            Rook(i,0);
 +
                    }
 +
                if (F==5)
 +
                {
 +
                    mn=2*M-2;
 +
                    cout <<  "Max number " << mn  << endl;
 +
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 +
                        for(int i = 0; i<2*M-1; ++i)
 +
                            Elephant(i,0);
 +
                    }
 +
                }
 +
    }
 +
 
 +
 
 +
 
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
 
 +
'''[[Уманский Александр]]'''
 +
 
 +
'''Работа программы''': Программа предлагает 2 режима работы 1 режим это нахождение для 1 из 5 фигур таких расстановок L фигур, на доске M*N, что они не бьют друг друга, второй режим возможно найти максимальное число фигур, которое можно расставить на этом поле, чтобы они не били друг друга.
 +
 
 +
'''Идея алгоритма''': Основная идея заключается в присваиванию клетке 1 из 3 значений, пустая клетка, битая клетка или клетка, в которой стоит фигура.
 +
В точку ставится фигура, дальше маркируются поля, в которые уже невозможно поставить фигуру, затем мы ставим следующую фигуру и снова маркируем поля, в которые не можем ничего поставить и так далее до нужного пользователю числа фигур. Поиск максимального числа это попытка поставить на доску как можно больше фигур, он пользуется алгоритмами первого пункта.
  
 
Скачать можно  [http://mech.spbstu.ru/File:Ch.rar тут].
 
Скачать можно  [http://mech.spbstu.ru/File:Ch.rar тут].
 +
 +
 +
 +
'''[[Капитанюк Светлана]]'''
 +
 +
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива. Если в клетке присутствует фигура, то тогада она обозначается '+', если же клетка осталась путсая, то тогда '0'.
 +
 +
'''Инструкция''': пользователь вводит размер доски, далее он выбирает то действие, которое он хотел бы выполнить: посчитать максимальное число возможных фигур на данной доске, или же расставить фигуры так, чтобы они не били друг друга.
 +
 +
Скачать можно  [http://tm.spbstu.ru/File:Chess_03.zip тут].
 +
 +
'''[[Демченко Артём]]'''
 +
 +
'''Основная идея программы''': Программа подсчитывает и выводит расстановку указанного кол-ва фигур на указанном поле и второй опицей выводит максимальную расстановку на поле размером size*size.
 +
 +
'''Инструкция''': Запустите программу и следуйте инструкциям. Сначала идет выбор алгоритма, после чего идет выбор фигуры и размер доски для подсчета максимальной расстановки на поле size*size. Результат будет выведен на экран.
 +
 +
Скачать можно [http://tm.spbstu.ru/File:Chessss.zip тут].
 +
 +
'''[[Гильманов Илья]]'''
 +
 +
'''Основная идея программы''': пользователь вводит размер доски MxM , тип фигур, их количество. Программа рассчитывает максимально возможное количество фигур , которые можно расположить на доске, чтобы они не били друг друга.
 +
 +
'''Инструкция к программе''': Пользователь вводит размер доски M(size*size).А затем предоставляется выбор между нахождением максимально возможного числа фигур , и их расстановкой.Также пользователь выбирает тип фигуры , и количество(если интересует расстановка).
 +
 +
Скачать можно [http://mech.spbstu.ru/File:CheEeeSss.rar здесь]
 +
 +
'''[[Киселёв Лев]]'''
 +
 +
'''Основная идея программы''': реализация задачи о расстановке фигур одинакового типа на произвольной доске MxM
 +
Скачать можно [http://mech.spbstu.ru/File:main.rar здесь]
 +
 +
'''[[Сергей Ляжков]]'''
 +
Инструкция:
 +
Вводите необходимые данные(кол-во строк, столбцов, фигуры, тип расстановки) согласно последовательности выполнения программы
 +
Краткое описание алгоритма:
 +
1)Выделяет память под доску(динамическая матрица)
 +
2)Устанавливает каждую следующую фигуру на n-е свободное место которое он нашел после последней установленной фигуры, где n изменяется от 1 до бесконечности(установка заканчивается тогда, когда программа не может установить очередную фигуру).
 +
3)Счетчик количества фигур, которые необходимо установить, уменьшается на 1 после каждой установки.
 +
4)После того, как фигура установлена, программа рекурсивно вызывает функцию установки очередной фигуры(возвращается в пункт 2)
 +
5)В рекурсивную функцию отправляется только копия доски. Таким образом, возвращаясь из рекурсии, мы получаем доску без последующих установленных фигур. Когда счетчик фигур, которые необходимо установить, уменьшается до нуля, данное поле сохраняется в списке.
 +
6)Вывод списка.
 +
Скачать можно [http://tm.spbstu.ru/File:Шахматы.zip тут]
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)