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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
'''[[Абрамов Игорь]]'''
+
'''[[Лебедев Станислав]]'''
  
'''Алгоритм''': в зависимости от выбранного режима работы, после ввода пользователем необходимой информации о размере поля а также типе расставляемых фигур, запускается основная рекурсивная функция, которая либо подсчитывает все возможные расстановки для заданного числа фигур и выводит их в файл, либо рассчитывает максимально возможное расставляемое число фигур. В первом режиме это происходит путём установки фигуры в свободную клетку и отметки клеток, которые бьются данной фигурой, затем запускается эта же функция для оставшихся клеток и т.д., пока число поставленных фигур не дойдёт до числа, заданного пользователем. Тогда эта расстановка выводится в файл и счётчик числа расстановок увеличивается на единицу. Во втором режиме как только находится расстановка для данного количества фигур, функция завершает свою работу, увеличивается счётчик количества фигур и функция вызывается уже для большего количества фигур, пока не будет найдено максимально возможное расставляемое на данной доске число фигур. 
+
'''Функционал программы''': получение всевозможных расстановок n однотипных шахматных фигур первой линии на поле n на n,таких,чтобы фигуры не били друг друга(считается,что фигуры одного цвета также могут бить друг друга) или получения максимального количества фигур первой линии,которые могут стоять на доске n*n;
  
'''Инструкция''': В меню пользователю предлагается указать размеры доски, тип расставляемых фигур и режим работы программы. После этого, если был выбран режим вывода всех расстановок, необходимо ввести количество расставляемых фигур, после чего программа выведет на экран количество расстановок, а в файле "output.txt" появятся изображения всех расстановок. При выборе второго режима, на экран будет выведено максимальное число фигур заданного типа, которые можно расставить на данной доске.
+
'''Идея алгоритма''': рекурсивно вызывается функция,которая ставит фигуру в пустую и небитую клетку, а также отмечает клетки,которые эта фигура бьет. Рекурсия продолжается до тех пор,пока либо не будет достигнуто нужное количество, либо не будет возможности поставить фигуру. После выхода из рекурсии начинается "обратный ход", в котором отмеченные как битые на этом шаге,"размечаются"(снимается отметка,что эта клетка бьется),а место,занятое самой фигурой, запоминается.
  
Ссылка для скачивания:[http://tm.spbstu.ru/File:Chess_Abramov.rar]
+
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].  
 
 
'''[[Андреева Полина]]'''
 
 
 
'''Краткое описание алгоритма''':если шахматную доску представить в виде одной строчки(вторую поставить следом за первой, третью за второй и тд), то получится двоичное число. Максимальное число которое может получиться если 111...111 перевести в десятичное ,это число М*М. Тогда абсолютно ВСЕ варианты расстановки фигур это двоичные записи чисел от 0 до М*М. В программе есть цикл, который рассматривает каждый вариант для числа от 0 до М*М, переводит его в двоичную форму. Программа рассматривает каждую клетку, где стоит фигура. Если эта фигура бьет других, то цикл прерывается, нам такой вариант не подходит. Если никакая фигура не бьет никакую другую, то идет подсчет количества фигур на доске. Если фигур столько, сколько нужно, то вывод на экран.
 
 
 
'''Инструкция''': На экране показано соответствие каждому номеру типа фигуры. Пользователь выбирает тип фигуры, испольуя номер. Дальше нужно ввести размер доски. Затем на экране появляется два варианта количества фигур на доске: максимальное или введенное пользователем. Пользователь выбирает вариант. Если второй, то затем надо будет ввести количество фигур.
 
[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 <cstring>
 
 
#include <iostream>
 
#include <iostream>
#include"math.h"
+
#include <math.h>
#include <fstream>
+
#include <cmath>
 +
 
 
using namespace std;
 
using namespace std;
  
int M, N;  // M-размер доски, N-коичество шахмат.
+
int n,type, *a, *stak, variant, maxst = 0;
int    sum;//нужно в процессе для подсчета количества шахмат
 
int **ChessBoard= new int* [M];
 
  
void ChessBoards(int k) //создание доски, k-число, которое переводим в двоичную запись, чтобы отобразить на доске расстановку фигур, 1-фигура есть, 0-нет.
+
void king(int x, int &top)                     //отметить битые клетки королем
 
{
 
{
     for (int i=0; i<M; i++) //создание массива
+
     // 012
 +
    // 345
 +
    // 678
 +
 
 +
    //0
 +
    if (((x % n) > 1) && ((x / n) > 1))
 
     {
 
     {
         ChessBoard[i] = new int[M];
+
         int ii = x - n - 1;
    }
+
         if (a[ii] != -2)
    for (int x=(M-1); x>=0; x=x-1)//заполнение массива фигурами (переводя k в двоичную форму)
 
    {
 
         for (int y=(M-1); y>=0; y=y-1)
 
 
         {
 
         {
             ChessBoard[x][y]=(k%2);
+
             a[ii]++;
             k=k/2;
+
            stak[top] = ii;
 +
             top++;
 
         }
 
         }
 
     }
 
     }
}
+
 
void print (char filename[] ) ///создание функции вывода массива в файл
+
    //1
 +
    if ((x / n) > 0)
 
     {
 
     {
         ofstream fout(filename, ios::app);
+
         int ii = x - n;
 
+
         if (a[ii] != -2)
         for (int x=0; x<M; ++x)
 
 
         {
 
         {
             for(int y=0; y<M; ++y)
+
             a[ii]++;
             {
+
             stak[top] = ii;
                fout << ChessBoard[x][y]<<" "; ///вывод массива в файл
+
             top++;
             }
 
            fout <<'\n';
 
 
 
 
         }
 
         }
        fout <<"\n\n";
 
 
        fout.close();
 
 
     }
 
     }
  
 
+
    //2
 
+
     if (((x % n) < (n - 1)) && ((x / n) > 0))
bool CheckHorse(int x, int y)//проверка для коня в клетке с номером x, y
 
{
 
 
 
     if (((x+1)<M) && ((y+2)<M) && (ChessBoard[x+1][y+2]==1))//если в клетке, куда может сходить конь (х+1,у+2) уже есть фигура, то этот вариант не подходит, так как один конь бьет другого.
 
 
     {
 
     {
         return false;
+
         int ii = x - n + 1;
 
+
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
    else if (((x+1)<M ) && ((y-2)>=0) && (ChessBoard[x+1][y-2]==1))//то же самое и в остальных случаях проверяем бьет ли один конь другого.
 
    {
 
        return false;
 
  
     }
+
     //3
     else if (((x-1)>=0) && ((y+2)<M) && (ChessBoard[x-1][y+2]==1))
+
     if ((x % n) > 0)
 
     {
 
     {
         return false;
+
         int ii = x - 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x-1)>=0) && ((y-2)>=0) && (ChessBoard[x-1][y-2]==1))
+
 
 +
    //5
 +
     if ((x % n) < (n - 1))
 
     {
 
     {
         return false;
+
         int ii = x + 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x+2)<M) && ((y+1)<M) && (ChessBoard[x+2][y+1]==1))
+
 
 +
    //6
 +
     if (((x % n ) > 0) && ((x / n) < (n - 1)))
 
     {
 
     {
         return false;
+
         int ii = x + n - 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x+2)<M ) && ((y-1)>=0) && (ChessBoard[x+2][y-1]==1))
+
 
 +
    //7
 +
     if ((x / n ) < (n - 1))
 
     {
 
     {
         return false;
+
         int ii = x + n;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x-2)>=0 ) && ((y+1)<M) && (ChessBoard[x-2][y+1]==1))
+
 
 +
    //8
 +
     if (((x % n ) < (n - 1)) && ((x / n) < (n - 1)))
 
     {
 
     {
         return false;
+
         int ii = x + n + 1;
 +
    if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x-2)>=0 ) && ((y-1)>=0) && (ChessBoard[x-2][y-1]==1))
+
}
 +
 
 +
void bishop(int x, int &top)                                                              //отметить битые клетки слоном
 +
{
 +
     //вверх влево
 +
    for (int i = (x - (n + 1)); ((i >= 0) && ((i%n) != (n-1))); i -= (n+1))
 
     {
 
     {
         return false;
+
         if (a[i] != -2)
 +
        {
 +
            a[i]++;
 +
            stak[top] = i;
 +
            top++;
 +
        }
 
     }
 
     }
     else //в итоге, если конь, стоящий в данной клетке никого не бьет, то этот вариант подходит
+
 
 +
     //вниз вправо
 +
    for (int i = (x + (n + 1)); ((i < n*n) && ((i%n) != 0)); i += (n+1))
 
     {
 
     {
         return true;
+
         if (a[i] != -2)
 +
        {
 +
            a[i]++;
 +
            stak[top] = i;
 +
            top++;
 +
        }
 
     }
 
     }
}
 
  
int Horse(int k)//k-то число которое нужно будет перевести в двоичную форму, это делается в main'е
+
    //вверх вправо
//в этой функции считаем количество фигур, если он равно введенному  или максимальному,то доска подходит и выводится в файл (все это в main'е)
+
     for (int i = x - (n - 1); ((i >= 0) && ((i%n) != 0)); i -= (n-1))
{
 
     for (int x=0; x<M; x++)
 
 
     {
 
     {
         int y;
+
         if (a[i] != -2)
        for (y=0; y<M; y++)
 
 
         {
 
         {
             if (ChessBoard[x][y]==1)//если в данной клетке стоит конь, то нужно проверить,
+
             a[i]++;
            // бьет оно кого-то или нет...
+
            stak[top] = i;
            //если в клетке нет коня, то ее проверять не нужно
+
             top++;
             {
 
                if (CheckHorse(x,y))//...делаем это с помощью этой функции,если конь в данной клетке х;у 
 
                //никого не бьет, то прибавляем 1 к количеству шахмат на доске и считаем дальше 
 
                {
 
                    sum=sum+1;
 
                }
 
                else //а если бьет, то выходим из цикла, на данной этапе выйдем только из внуреннего
 
                {
 
                    sum=0;//количество фигур обнуляем
 
                    break;
 
                }
 
            }
 
 
         }
 
         }
        if (y<M)//если из внутреннего цикла вышли раньше, значит у досчитался не до конца,
+
    }
         //то есть он меньше своего максимального значения М
+
 
 +
    //вниз влево
 +
    for (int i = x + (n - 1); ((i < n*n) && ((i%n) != (n-1))); i += (n-1))
 +
    {
 +
         if (a[i] != -2)
 
         {
 
         {
              
+
             a[i]++;
             break;//тогда выходим и из внешнего цикла
+
            stak[top] = i;
 +
             top++;
 
         }
 
         }
 
     }
 
     }
    return sum; //возвращаем количество фигур
 
 
}
 
}
  
bool CheckKing(int x, int y) //все то же самое для проверки короля, стоящего в клетке х,у
+
void knight(int x, int &top)                                           //отметить битые клетки конем
 
{
 
{
 
+
     if (((x%n) > 0) && (x/n) > 1)
     if (((x+1)<M) && ((y+1)<M) && (ChessBoard[x+1][y+1])==1)//если в клетке куда может сходить король
 
    //уже есть фигура, то клетка не подходит и т.д
 
 
     {
 
     {
         return false;
+
         int ii = x - 2*n - 1;
 
+
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
    else if (((x+1)<M ) && (ChessBoard[x+1][y]==1))
 
    {
 
        return false;
 
  
     }
+
     if (((x%n) > 1) && (x/n) > 0)
    else if (((x+1)<M) && ((y-1)>=0) && (ChessBoard[x+1][y-1]==1))
 
 
     {
 
     {
         return false;
+
         int ii = x - n - 2;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x-1)>=0) && ((y-1)>=0) && (ChessBoard[x-1][y-1]==1))
+
 
 +
     if (((x%n) > 1) && (x/n) < (n - 1))
 
     {
 
     {
         return false;
+
         int ii = x + n - 2;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x-1)>=0) && ((y+1)<M) && (ChessBoard[x-1][y+1]==1))
+
 
 +
     if (((x%n) > 0) && (x/n) < (n - 2))
 
     {
 
     {
         return false;
+
         int ii = x + 2*n - 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((x-1)>=0) && (ChessBoard[x-1][y]==1))
+
 
 +
     if (((x%n) < (n - 1)) && (x/n) < (n - 2))
 
     {
 
     {
         return false;
+
         int ii = x + 2*n + 1;
     }
+
        if (a[ii] != -2)
     else if (((y+1)<M) && (ChessBoard[x][y+1]==1))
+
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 +
     }
 +
 
 +
     if (((x%n) < (n - 2)) && (x/n) < (n - 1))
 
     {
 
     {
         return false;
+
         int ii = x + n + 2;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else if (((y-1)>=0) && (ChessBoard[x][y-1]==1))
+
 
 +
     if (((x%n) < (n - 2)) && (x/n) < 0)
 
     {
 
     {
         return false;
+
         int ii = x - n + 2;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
     else
+
 
 +
     if (((x%n) < (n - 1)) && (x/n) < 1)
 
     {
 
     {
         return true;
+
         int ii = x - 2*n + 1;
 +
        if (a[ii] != -2)
 +
        {
 +
            a[ii]++;
 +
            stak[top] = ii;
 +
            top++;
 +
        }
 
     }
 
     }
 
}
 
}
  
int King(int k) //так же как и для коня, проверяем каждую клетку
+
void rook(int x, int &top)                                                     //отметить битые клетки ладьей
//подходит-прибавляем к количеству фигур sum единичку, нет-обнуляем сумму и выходим из цикла
 
 
{
 
{
     for (int x=0; x<M; x++)
+
     int k = x - (x % n);
 +
    while ((k/n) == (x/n))
 
     {
 
     {
        int y;
+
 
         for (y=0; y<M; y++)
+
         if ((k != x) && (a[k] != -2))
 
         {
 
         {
             if (ChessBoard[x][y]==1)
+
             a[k]++;
             {
+
            stak[top] = k;
                if (CheckKing(x,y))
+
             top++;
                {
 
                    sum=sum+1;
 
                }
 
                else
 
                {
 
                    sum=0;
 
                    break;
 
                }
 
            }
 
 
         }
 
         }
         if (y<M)
+
        k ++;
 +
    }
 +
 
 +
    k = (x % n);
 +
    while (((k/n)) != n)
 +
    {
 +
         if ((k != x) && (a[k] != -2))
 
         {
 
         {
             break;
+
             a[k]++;
 +
            stak[top] = k;
 +
            top++;
 
         }
 
         }
 +
        k += n;
 
     }
 
     }
    return sum;
+
 
 
}
 
}
 +
void set_figure(int x, int &top)                                    //ставим фигуры на доску
 +
{
 +
    //отмечаем "битые" клетки
 +
    switch (type)
 +
    {
 +
//король
 +
        case 1:
 +
        {
 +
            king(x,top);
 +
            break;
 +
        }
  
int CheckQueen(int x, int y)///проверка для королевы, принцип тот же, королева стит в клеке x,y
+
//слон
///1 значит как true в bool (как в коне или короле), 0 - false
+
case 2:
{ int returnn=1;//начала true, дальше если будет false, то return примет значение 0, а если все пдходит
+
{
///то так и стается 1
+
    bishop(x,top);
int m;
+
            break;
    for (m=1; m<M; m++)
+
}
  { //проверяем для диагоналей
+
 
    ///если по диагонале клетки х,у стоит еще королва, то такой вариант не подходит, выходим из цикла
+
//конь
    ///разбито на 4 услвия, так как если не разбивать, то клетка в кторой стоит данная королева
+
case 3:
    ///тоже будет считаться и выходить из цикла
+
{
      if (((x+m)<M)&&((y+m)<M))
+
    knight(x,top);
      {
+
break;
          if (ChessBoard[x+m][y+m]==1)
+
}
          {returnn=0;
+
//ладья
          break;
+
        case 4:
          }
+
         {
      }
+
            rook(x,top);
      if (((x-m)>=0)&&((y+m)<M))
+
            break;
      {
+
        }
          if (ChessBoard[x-m][y+m]==1)
+
        //ферзь
          {returnn=0;
+
         case 5:
          break;}
+
         {
      }
+
             rook(x,top);
      if (((x+m)<M)&&((y-m)>=0))
+
             bishop(x,top);
      {
+
            break;
          if (ChessBoard[x+m][y-m]==1)
 
         {returnn=0;
 
          break;}
 
      }
 
      if (((x-m)>=0)&&((y-m)>=0))
 
      { if (ChessBoard[x-m][y-m]==1)
 
          {returnn=0;
 
          break;}
 
      }
 
      if (m!=x) ///тут считаем по вертикали и горизонтали, так как длаем в цикле для m, то m меняется
 
         ///и в какой-то момент может стать х, и тогда роверятьбуде клетку в которой стоит ДАННАЯ и выходить
 
         ///это не нужно так что выходим только если m не равен x
 
        {
 
             if (ChessBoard[m][y]==1) //если по горизонтали есть какая-о клетка, где стоит королева, то выходим
 
             {
 
                returnn=0;
 
                break;
 
            }
 
 
         }
 
         }
        if (m!=y)//то же по вертикали
+
    }
        {
+
 
          if (ChessBoard[x][m]==1)
+
    //отмечаем,что в данной клетке стоит фигура
            {
+
a[x] = -1;
                returnn=0;
+
    stak[top] = x;
                break;
+
    top++;
            }
 
        }
 
  }
 
  return returnn;
 
 
}
 
}
  
int Queen(int k)//тут также как и для коня и короля
+
void step(int top,int x,int st)
 
{
 
{
for (int x=0; x<M; x++)
+
int xtop = top;
    {
+
switch (variant)
        int y;
+
{
        for (y=0; y<M; y++)
+
case 1:
        {
+
{
            if (ChessBoard[x][y]==1)//если в клетке королева, проверяем подходи ли она нам
+
if (st != (n - 1))
            {
+
{
                if (CheckQueen(x,y))
+
set_figure(x,top);
                 {
+
for (int i = 0; i < (n*n); i++)
                    sum=sum+1;
+
if (a[i] == 0)
                }
+
step(top,i,st + 1);
                else
+
}
                {
+
else[[:File:Шахматы.rar]]
                    sum=0;
+
{
                    break;
+
set_figure(x,top);
                }
+
                 cout << endl;
            }
+
for (int i = 0; i < (n*n); i++)
        }
+
{
        if (y<M)
+
cout.width(3);
        {
+
if (((i % n) == 0) && (i != 0))
            break;
+
cout << endl;
        }
+
if (a[i] == -1)
    }
+
cout << 1;
    return sum;
+
else
}
+
cout << 0;
 
+
}
int CheckRook(int x, int y)///ладья, просто берем ту часть из проверки королевы, где проверка по горизонтали и вертикали
+
cout << endl;
{ int returnn=1;
+
}
int m;
+
break;
    for (m=0; m<M; m++)
+
}
 +
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++)
 
     {
 
     {
         if (m!=x)
+
         if ((a[stak[i]] != -1) && (a[stak[i]] != -2))
        {
+
             a[stak[i]]--;
            if (ChessBoard[m][y]==1)
+
        else
             {
+
             //не забываем отметить,что фигура уже здесь стояла(чтобы избежать повторов)
                returnn=0;
+
            if (a[stak[i]] == -1)
                break;
+
                 a[stak[i]] = -2;
             }
+
//      cerr << " Back "  << stak[i] << endl;
        }
 
        if (m!=y)
 
        {
 
          if (ChessBoard[x][m]==1)
 
            {
 
                 returnn=0;
 
                break;
 
            }
 
        }
 
 
     }
 
     }
 +
}
  
 +
int main()
 +
{
  
      return returnn;
+
    //cin >> n >> type >> variant;
}
+
    n = 5;
 +
    type = 4;
 +
variant = 1;
 +
    a    = new int[n*n];
 +
    stak = new int[n*n*4];
  
int Rook(int k)//все то же самое, количество фигур на доске
+
     for (int i = 0; i < (n*n); i++)
{
 
     for (int x=0; x<M; x++)
 
 
     {
 
     {
        int y;
+
         for (int j = 0; j < (n*n); j++)
         for (y=0; y<M; y++)
+
             a[j] = 0;
        {
+
        if (variant == 1)
             if (ChessBoard[x][y]==1)
+
            cout << "__________________________________" << endl;
            {
+
         step(0,i,0);
                if (CheckRook(x,y)==1)
 
                {
 
                    sum=sum+1;
 
 
 
                }
 
                else
 
                {
 
                    sum=0;
 
                    break;
 
                }
 
            }
 
        }
 
         if (y<M)
 
        {
 
            break;
 
        }
 
 
     }
 
     }
 +
if (variant == 2)
 +
  cout << maxst;
 +
    return 0;
 +
}
 +
</syntaxhighlight>
 +
</div>
  
    return sum;
 
}
 
  
int CheckElephant(int x, int y)//для слона берем ту часть прроверки королевы, где по диагонали
 
{ int returnn=1;
 
  for (int i=1; i<M; i++)
 
  {
 
      if (((x+i)<M)&&((y+i)<M))
 
      {
 
          if (ChessBoard[x+i][y+i]==1)
 
          {returnn=0;
 
          break;
 
          }
 
      }
 
      if (((x-i)>=0)&&((y+i)<M))
 
      {
 
          if (ChessBoard[x-i][y+i]==1)
 
          {returnn=0;
 
          break;}
 
      }
 
      if (((x+i)<M)&&((y-i)>=0))
 
      {if (ChessBoard[x+i][y-i]==1)
 
        {returnn=0;
 
          break;}
 
      }
 
      if (((x-i)>=0)&&((y-i)>=0))
 
      { if (ChessBoard[x-i][y-i]==1)
 
          {returnn=0;
 
          break;}
 
      }
 
  }
 
  return returnn;
 
}
 
  
int Elephant(int k)///считаем кличесво фигур  
+
'''[[Иванова Яна]]'''
{
+
 
for (int x=0; x<M; x++)
+
'''Краткое описание алгоритма''': Функция, которая выполняет поиск расстановок, пытается поставить фигуру в каждую клетку. В случае неудачи программа отмечает клетки, в которых фигура уже побывала, но постановка не удалась, отрицательной величиной, равной по модулю шагу, на котором эта постановка была испробована. В случае пустой клетки она отмечается нулем, в случае успеха клетка отмечается положительным числом, равным шагу, соответствующему попытке постановки.
    {
+
Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
        int y;
+
 
        for (y=0; y<M; y++)
+
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры.
        {
+
Если он выбирает максимальное число расстановок, то программа выводит их количество, а также предлагает вывести все расстановки на экран. Другой вариант работы программы - вывод расстановок N фигур.
            if (ChessBoard[x][y]==1)
+
 
            {
+
Посмотреть программу можно [http://tm.spbstu.ru/Файл:chess(1).zip здесь]
                if (CheckElephant(x,y))
+
 
                {
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
                    sum=sum+1;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
                }
+
 
                else
+
#include <iostream>
                {
+
#include <algorithm>
                    sum=0;
+
#include <exception>
                    break;
+
#include <string>
                }
+
#include <algorithm>
            }
+
 
        }
+
//пусть для определенности максимальный размер доски - 128 клеток
        if (y<M)
+
#define MAX_SIZE 128
        {
 
            break;
 
        }
 
    }
 
    return sum;
 
}
 
  
int main ()
+
// перечисление для определения типа фигуры
 +
enum figure_type
 
{
 
{
     ofstream MyFile("MyFile", ios::trunc);
+
     KING,
     MyFile.close(); // очищаем файл, чтоб при новой записи не было из рошлого запуска
+
    QUEEN,
 +
    ROOK,
 +
    BISHOP,
 +
     KNIGHT
 +
};
  
int figure, z;
+
// класс для создания доски и расстановки фигур
    cout<<"enter a figure 1-queen, 2-king, 3-rook , 4-horse or 5-elephant ";
+
class chess_board
     cin>>figure;///тип фигуры, 1 - королевА, 2-король,3-ладья,4-конь,6-слон
+
{
      cout << "\n enter a size of a board M - even number ";///ввести ЧЕТНЫЙ размер доски М
+
public:
     cin >> M;
+
     // конструктор (принимает только размеры)
    if ( M%2 != 0)///проверка М на четность, с помощью остатка от деления на 2
+
     chess_board(const int &size)
 
     {
 
     {
         while (M%2 != 0)
+
         if (size >= 0 && size <= MAX_SIZE)
 +
        {
 +
            size_ = size;
 +
            clean_board();
 +
        }
 +
 
 +
        else
 
         {
 
         {
             cout<<" you need EVEN number, enter one more time ";
+
             std::cout << "wrong size" << std::endl;
             cin>>M;
+
             throw std::string("wrong size");
 
         }
 
         }
 
     }
 
     }
  
    cout<<"\n choose  1- max amount or 2 - your amount of figures ";
 
    cin>>z;///z-один из вариантов 1-максимаьное число фигур на доске,2-пользователь сам вводит
 
  
     switch (figure)///выбираем фигуру
+
     // функция очистки доски (занулить все клетки)
 +
    void clean_board()
 
     {
 
     {
    case 1:///королева
+
        //обнулить счетчик количества фигур на доске
    {
+
        figures_on_board_ = 0;
         if (z==2)///пользоватеь сам вводит количество
+
        //присвоить всем клеткам значение 0
 +
         for (int i = 0; i < size_; ++i)
 
         {
 
         {
             cout<<"\n enter an amount of figures ";
+
             for (int j = 0; j < size_; ++j)
            cin >> N;///ввести количество
 
            if (N>M)///проверка на то, сможет ли такое количество уместиться на доске в правильном виде
 
 
             {
 
             {
                 while (N>M)
+
                 board_[i][j] = 0;
                {
 
                    cout<<" too many figures, enter one more time ";
 
                    cin>>N;
 
                }
 
 
             }
 
             }
            ///вот ниже i- те числа которые нужно перевести в двоичную форму
+
         }
            for (int i=0; i<=pow(2,(M*M)); i++)///каждый i-новый вариант расстановик фигур
+
    }
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (Queen(k)==N)///если в данной варианте фигур столько. сколько ввел пользователь, то выводим
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
        }
 
        else ///вариант максимального числа фигур на доске
 
         {  ///так же как и в предыдущем пункте, только количество фигур N максимально,
 
            /// в случае королевы оно равно размеру доски 
 
            N=M;
 
            for (int i=0; i<=pow(2,(M*M)); i++)
 
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (Queen(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
        }
 
  
         break;
+
    // функция, принимающая размер доски
 +
    int get_size()
 +
    {
 +
         return size_;
 +
    }
 +
    // функция, обновляющая количество фигур на доске
 +
    int get_figures_number()
 +
    {
 +
        return figures_on_board_;
 
     }
 
     }
     case 2:///то же самое для короля
+
 
 +
     //функция, пытающаяся поставить фигуру на свободное место и возвращающая
 +
    //истину в случае успеха и ложь в случае неудачи
 +
    bool put_figure (const figure_type& figure, const int& x, const int& y, const int& step)
 
     {
 
     {
         if (z==2)
+
         if (board_[x][y] > 0 || board_[x][y] < -step)
 
         {
 
         {
            cout<<"\n enter an amount of figures ";
+
          //если здесь уже стоит фигура или мы когда-то пытались ее сюда поставить, вернуть ложь
            cin >> N;
+
            return false;
              if ( N>(M*M)/4)
+
        }
            {
+
 
                while (N>(M*M)/4)
+
        if (check_figure(figure, x, y))
                {
+
        {
                    cout<<" too many figures, enter one more time ";
+
            board_[x][y] = step;
                    cin>>N;
+
            ++figures_on_board_;
                }
+
            return true;
            }
 
            for (int i=0; i<=pow(2,(M*M)); i++)
 
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (King(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
 
         }
 
         }
else
+
        else
 
         {
 
         {
             N=(M*M)/4;
+
             return false;
            for (int i=0; i<=pow(2,(M*M)); i++)
 
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (King(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
 
         }
 
         }
        break;
 
 
     }
 
     }
     case 3:///для ладьи
+
 
 +
     //отметить клетку как ранее пройденную функцией
 +
    //вычесть единицу из количества фигур на доске
 +
    void remove_figure(const int& x, const int& y)
 
     {
 
     {
         if (z==2)
+
         board_[x][y] *= -1;
 +
        --figures_on_board_;
 +
    }
 +
 
 +
    //функция печати доски на экран
 +
    void print() const
 +
    {
 +
        using namespace std;
 +
        cout << "==========================================" << endl;
 +
        for (int i = 0; i < size_; ++i)
 
         {
 
         {
             cout<<"\n enter an amount of figures ";
+
             for (int j = 0; j < size_; ++j)
            cin >> N;
 
              if (N>M)
 
 
             {
 
             {
                 while (N>M)
+
                 //если фигура стоит в клетке, то вывести "*", если нет - вывести "-"
                {
+
                cout << (board_[i][j] > 0?"*":"-") << " ";
                    cout<<" too many figures, enter one more time ";
 
                    cin>>N;
 
                }
 
 
             }
 
             }
 +
            cout << endl;
 +
        }
 +
        cout << "==========================================" << endl;
 +
    }
 +
 +
private:
  
            for (int i=0; i<=pow(2,(M*M)); i++)
+
    //функция, проверяющая возможность или невозможность постановки фигуры на данную клетку
            {
+
    bool check_figure(const figure_type& figure, const int& x, const int& y)
                sum=0;
+
    {
                int k=i;
+
         //выбор следующего действия в зависимости от типа фигуры
                ChessBoards(k);
+
         switch (figure)
                if (Rook(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
         }
 
         else
 
 
         {
 
         {
             N=M;
+
             case KING:
             for (int i=0; i<=pow(2,(M*M)); i++)
+
                return check_king(x, y);
 +
            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;
 +
        }
 +
    }
 +
 
 +
    //поиск расстановок короля
 +
    bool check_king(const int& x, const int& y)
 +
    {
 +
        int min_x = std::max(x - 1, 0);
 +
        int max_x = std::min(x + 1, size_ - 1);
 +
        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)
 
             {
 
             {
                sum=0;
+
                 if (board_[i][j] > 0)
                int k=i;
 
                ChessBoards(k);
 
                 if (Rook(k)==N)
 
 
                 {
 
                 {
                     print("MyFile");
+
                     return false;
 
                 }
 
                 }
 
             }
 
             }
 
         }
 
         }
         break;
+
         return true;
 
     }
 
     }
     case 4:///конь
+
 
 +
     //поиск расстановок ладьи
 +
    bool check_rook(const int& x, const int& y)
 
     {
 
     {
         if (z==2)
+
         for (int i = 0; i < size_; ++i)
 
         {
 
         {
             cout<<"\n enter an amount of figures ";
+
             if (board_[i][y] > 0)
            cin >> N;
 
              if (N>(M*M)/2)
 
 
             {
 
             {
                 while (N>(M*M)/2)
+
                 return false;
                {
 
                    cout<<" too many figures, enter one more time ";
 
                    cin>>N;
 
                }
 
            }
 
 
 
            for (int i=0; i<=pow(2,(M*M)); i++)
 
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (Horse(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
 
             }
 
             }
 
         }
 
         }
         else
+
         for (int j = 0; j < size_; ++j)
 
         {
 
         {
             N=(M*M)/2;
+
             if (board_[x][j] > 0)
            for (int i=0; i<=pow(2,(M*M)); i++)
 
 
             {
 
             {
                 sum=0;
+
                 return false;
                int k=i;
 
                ChessBoards(k);
 
                if (Horse(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
 
             }
 
             }
 
         }
 
         }
         break;
+
         return true;
 
     }
 
     }
     case 5:///слон
+
 
 +
     //поиск расстановок слона
 +
    bool check_bishop(const int& x, const int& y)
 
     {
 
     {
         if (z==2)
+
         bool check = true;
         {
+
 
            cout<<"\n enter an amount of figures ";
+
        int k_start_1 = -std::min(x, y);
            cin >> N;
+
         int k_end_1 = std::min( size_ - x, size_ - y) - 1;
                if (N>2*M-2)
+
 
            {
+
        int k_start_2 = -std::min( x, size_ - y - 1);
                while (N>2*M-2)
+
        int k_end_2 = std::min( y, size_ - x - 1);
                {
+
 
                    cout<<" too many figures, enter one more time ";
+
 
                    cin>>N;
+
        for (int k = k_start_1; k <= k_end_1; ++k)
                }
+
        {
            }
+
            check = check_coord(x + k, y + k) && check ;
            for (int i=0; i<=pow(2,(M*M)); i++)
 
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (Elephant(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
 
         }
 
         }
         else
+
         for (int k = k_start_2; k <= k_end_2; ++k)
 
         {
 
         {
             N=2*M-2;
+
             check = check_coord(x + k, y - k) && check;
            for (int i=0; i<=pow(2,(M*M)); i++)
 
            {
 
                sum=0;
 
                int k=i;
 
                ChessBoards(k);
 
                if (Elephant(k)==N)
 
                {
 
                    print("MyFile");
 
                }
 
            }
 
 
         }
 
         }
         break;
+
 
 +
         return check;
 
     }
 
     }
     default : ///а это еси пользоватеь ввел цифру, которая не соответстует ни одной фигуре
+
 
     {
+
 
         cout<<"NOOOOO";
+
     //поиск расстановок коня
         break;
+
    bool check_knight(const int& x, const int& y)
 +
     {
 +
         bool check =
 +
            check_coord(x - 2, y - 1) &&
 +
            check_coord(x - 2, y + 1) &&
 +
            check_coord(x - 1, y - 2) &&
 +
            check_coord(x - 1, y + 2) &&
 +
            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;
 
     }
 
     }
    };
 
  
 +
    //поиск расстановок королевы
 +
    bool check_queen(const int& x, const int& y)
 +
    {
 +
        return check_rook(x, y) && check_bishop(x, y);
 +
    }
  
     return 0;
+
  //функция поиска расстановок, в случае, когда на доске что-то стоит, вернуть ложь
 +
  //иначе поставить вернуть истину
 +
     bool check_coord(const int& x, const int& y)
 +
    {
 +
        if (x >= 0 && x < size_ && y >= 0 && y < size_)
 +
        {
 +
            if (board_[x][y] > 0)
 +
            {
 +
                return false;
 +
            }
 +
        }
 +
        return true;
 
     }
 
     }
</syntaxhighlight>
 
</div>
 
  
'''[[Бальцер Анастасия]]'''
+
    // if board_[x][y] == 0
 
+
    //    клетка свободна
'''Краткое описание алгоритма''': Для каждой фигуры написана отдельная функция, выполняющая поиск расстановок. После выбора типа фигуры, соответствующая функция выполняет поиск возможных расстановок. Она проходя по строкам двумерного массива пытается поставить фигуру в каждую клетку. Проходя по массиву она маркирует клетки, ставит 0 (если клетка свободна), 1 (если клетка находится под ударом), 2 (если клетка занята). Программа аналитически считает максимальное количество фигур для заданного размера доски, возможное число расстановок для заданных типа фигуры, размера доски и количества фигур.
+
    // if board_[x][y] == s
 
+
    //    фигура была поставлена на шаге S
'''Инструкция''': При запуске программы появляется меню, в котором каждому типу фигуры сопоставлен номер, с помощью которого пользователь и выбирает тип фигуры. Затем пользователю на выбор предлагается 2 режима работы программы: первый выводит число возможных расстановок на экран, а список возможных расстановок в отдельный файл (при этом пользователь дополнительно выбирает число фигур); второй выводит на экран максимальное число фигур выбранного типа, которые можно расставить на заданной доске.
+
    // if board_[x][y] == -s
 +
    //    клетка свободна, но была попытка поставить фигуру на шаге S
 +
    int board_[MAX_SIZE][MAX_SIZE];
 +
    int size_;
 +
    int figures_on_board_;
 +
};
  
Посмотреть программу можно [http://tm.spbstu.ru/Файл:Расстановка.zip тут]
+
//функция расчета максимума для любой доски в зависимости от типа фигуры
 
+
int get_max_figures (const figure_type& figure, const int& size)
'''[[Белоусова Екатерина]]'''
 
 
 
'''Краткое описание алгоритма''': доска представлена в виде динамического массива, заполненного 1 и 0. 1-стоит фигура, 0-пустое место. Программа при помощи рекурсии вызывает функцию, которая ставит фигуру в пустую клетку и проверяет, находится ли эта фигура под ударом других.
 
 
 
'''Инструкция''': пользователь вводит четный размер доски М*М, затем выбирает, какую фигуру он хочет расставить на этой доске, после чего ему предлагается выбрать количество фигур(в скобках указывается максимальное количество фигур, которые можно расставить на доске М*М).Программа выводит на экран всевозможные расстановки, пронумеровывая каждую, и сохраняет их в файл.
 
 
 
Скачать можно  [http://tm.spbstu.ru/Файл:задача_1.zip тут].
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream>
 
#include <stdlib.h>
 
#include <stdio.h>
 
#include <string>
 
#include <cstring>
 
#include <fstream>
 
#include <locale.h>
 
#include<iomanip>
 
#include<math.h>
 
 
 
using namespace std;
 
 
 
 
 
int n, figureID, figura, maxCount; /// n - размер доски, figureID - номер фигуры, figura - колическтво фигур, maxCount - максимальное возможное количество фигур
 
int results_count = 0; /// определяем тип и задаем начальное значение results_count(номер результата)
 
int **mass; /// определяем двумерный массив
 
 
 
///создаем массив размером n*n
 
int** create_mass(int n)
 
 
{
 
{
 
+
     switch (figure)
     int **mass = new int* [n];
 
    for (int a=0; a<n; ++a)
 
 
     {
 
     {
         mass[a] = new int [n];
+
         case KING:
         memset((char*)mass[a],0,n*sizeof(int)); ///зануление массива
+
            return (size + 1) / 2;
 +
        case QUEEN:
 +
            if (size <= 2)
 +
            {
 +
                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;
 
     }
 
     }
 
        return mass;
 
 
 
}
 
}
  
///функция вывода массива
+
//функция для расстановки максимального числа фигур на доске
void output_mass ()
+
void place_figures_for_max(chess_board &board, const figure_type& figure, const int& max_figures, int step)
 
{
 
{
 
+
    ++step;
     for (int a=0; a<n; ++a)///заполнение ячеек массива от 0 до n по горизонтали
+
    const int size = board.get_size();
 +
     for (int i = 0; i < size; ++i)
 
     {
 
     {
 
+
         for (int j = 0; j < size; ++j)
         for(int b=0; b<n; ++b)///заполнение ячеек массива от 0 до n по вертикали
 
 
         {
 
         {
             cout << mass[a][b]<<" "; ///вывод массива на экран
+
             //если мы можем поставить фигуру, то добавляем к максимуму единицу и запускаем цикл снова
 +
            if (board.put_figure(figure, i, j, step))
 +
            {
 +
                //если число фигур на доске достигло максимума, то вывести доску
 +
                if (board.get_figures_number() == max_figures)
 +
                {
 +
                    board.print();
 +
                }
 +
                //если число фигур не достигло максимума, продолжить выполнение функции
 +
                else
 +
                {
 +
                    place_figures_for_max(board, figure, max_figures, step);
 +
                }
 +
                board.remove_figure(i, j);
 +
            }
 
         }
 
         }
 
        cout << '\n';
 
 
 
     }
 
     }
 
    cout << "Result #" << ++results_count <<"\n\n"; /// вывод номера результата
 
 
 
}
 
}
  
void zapis (char Zapis[] ) ///функции записи решений в файл
+
//функция, принимающая ввод с клавиатуры как строковый тип данных
 +
figure_type get_figure_type(const std::string& str)
 
{
 
{
     ofstream fout(Zapis, ios::app);///запись в фаил "Zapis"
+
     using namespace std;
  
     for (int x=0; x<n; ++x)///заполнение ячеек массива от 0 до n по горизонтали
+
     figure_type figure;
 +
    if (str == string("king"))
 +
    {
 +
        figure = KING;}
 +
    else if (str == string("queen"))
 +
    {
 +
        figure = QUEEN;}
 +
    else if (str == string("rook"))
 
     {
 
     {
         for(int y=0; y<n; ++y)///заполнение ячеек массива от 0 до n по вертикали
+
         figure = ROOK;
        {
 
            fout<< mass[x][y]<<" "; ///вывод решений в файл
 
        }
 
        fout<<'\n';
 
 
     }
 
     }
     fout<<"\n\n";
+
     else if (str == string("bishop"))
     fout.close();
+
     {
}
+
        figure = BISHOP;
 
+
    }
///проверяем наличие фигуры в строке а
+
     else if (str == string("knight"))
bool isEmptyHorisontal(int a)
 
{
 
 
 
     for(int i=0; i<n; ++i)///создаем цикл от 0 до n
 
 
     {
 
     {
        if(mass[a][i])///в каждой ячейке массива [a][i]
+
      figure = KNIGHT;
        {
 
            return false;///неверно
 
        }
 
 
     }
 
     }
 
+
     //вывести ошибку в случае неверного ввода
     return true;///в остальных случаях верно
+
     else
 
 
}
 
 
 
///проверяем наличие фигур в столбце b
 
bool isEmptyVertical(int b)
 
{
 
 
 
     for(int i=0; i<n; ++i)///создаем цикл от 0 до n
 
 
     {
 
     {
         if(mass[i][b])///в каждой ячейке массива [i][b]
+
         cout << "wrong figure type" << endl;
        {
+
        throw string("wrong figure type");
            return false;///неверно
 
        }
 
 
     }
 
     }
  
     return true;///в остальных случаях верно
+
     return figure;
 
 
 
}
 
}
  
///проверяем наличие фигур на диагоналях
+
int main()
bool isEmptyDiagonales(int a, int b)
 
 
{
 
{
 +
    //использовать стандартное пространств имен
 +
    using namespace std;
  
     for(int i=1; a-i>=0 && b-i>=0; ++i)///диагональ влево-вверх
+
     int size;
 +
    string type_of_figure;
 +
    string type_of_action;
 +
    figure_type figure;
 +
 
 +
    cout << "Возможные фигуры: king, queen, rook, bishop, knight" << endl;
 +
    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"))
 
     {
 
     {
        if(mass[a-i][b-i])///в каждой ячейке массива [a-i][b-i]
 
        {
 
            return false;///неверно
 
        }
 
    }
 
  
    for(int i=1; a+i<n && b+i<n; ++i)///диагональ вправо-вниз
+
        int max_figures = get_max_figures(figure, size);
    {
+
        cout << "Max figures: " << max_figures << endl;
         if(mass[a+i][b+i])///в каждой ячейке массива [a+i][b+i]
+
 
 +
        cout << "Хотите ли вы просмотреть все варианты? (yes/no) ";
 +
        string answer;
 +
        cin >> answer;
 +
        //если нужно вывести все расстановки, то применить непосредственно функцию поиска расстановок максимума
 +
         if (answer == string("yes"))
 
         {
 
         {
             return false;///неверно
+
             int step = 0;
 +
            place_figures_for_max(board, figure, max_figures, step);
 
         }
 
         }
 
     }
 
     }
 
+
    //иначе если нужно расставить определенное количество фигур, то применить функцию поиска расстановок
     for(int i=1; a+i<n && b-i>=0; ++i)///диагональ влево-вниз
+
    //относительно введенного числа
 +
     else if (type_of_action == string("placing"))
 
     {
 
     {
         if(mass[a+i][b-i])///в каждой ячейке массива [a+i][b-i]
+
         int figures_to_place;
         {
+
        cout << "Сколько фигур нужно расставить: ";
            return false;///неверно
+
         cin >> figures_to_place;
         }
+
 
 +
        int step = 0;
 +
         place_figures_for_max(board, figure, figures_to_place, step);
 
     }
 
     }
 
+
     //иначе вывести ошибку действия
     for(int i=1; a-i>=0 && b+i<n; ++i)///диагональ вправо-вверх
+
    else
 
     {
 
     {
         if(mass[a-i][b+i])///в каждой ячейке массива [a-i][b+i]
+
         cout << "wrong type of action" << endl;
        {
+
        throw string("wrong type of action");
            return false;///неверно
 
        }
 
 
     }
 
     }
  
        return true;///в остальных случаях верно
+
    return 0;
 
 
 
}
 
}
  
///проверяем наличие фигур по горизонтали, вертикали и диагоналям
 
bool tryQueen(int a, int b)
 
{
 
  
    if (!isEmptyHorisontal(a) || !isEmptyVertical(b) || !isEmptyDiagonales(a,b))///если не выполняются эти условия,
+
</syntaxhighlight>
                                                                                ///т.е. постановка фигуры не удовлетворяет расстановке
+
</div>
                                                                                ///по горизонтали, или по вертикали, или по диагонали
 
    return false;///неверно
 
  
    return true;///в остальных случаях верно
+
'''[[Андреева Полина]]'''
  
}
+
'''Краткое описание алгоритма''':если шахматную доску представить в виде одной строчки(вторую поставить следом за первой, третью за второй и тд), то получится двоичное число. Максимальное число которое может получиться если 111...111 перевести в десятичное ,это число М*М. Тогда абсолютно ВСЕ варианты расстановки фигур это двоичные записи чисел от 0 до М*М. В программе есть цикл, который рассматривает каждый вариант для числа от 0 до М*М, переводит его в двоичную форму. Программа рассматривает каждую клетку, где стоит фигура. Если эта фигура бьет других, то цикл прерывается, нам такой вариант не подходит. Если никакая фигура не бьет никакую другую, то идет подсчет количества фигур на доске. Если фигур столько, сколько нужно, то вывод на экран.
  
/// функция поиска результатов решений.
+
'''Инструкция''': На экране показано соответствие каждому номеру типа фигуры. Пользователь выбирает тип фигуры, испольуя номер. Дальше нужно ввести размер доски. Затем на экране появляется два варианта количества фигур на доске: максимальное или введенное пользователем. Пользователь выбирает вариант. Если второй, то затем надо будет ввести количество фигур.
/// row - номер очередной строки в которую нужно поставить очередного ферзя.
+
[http://tm.spbstu.ru/Файл:ШахматыАП.rar Программа]
/// count - количество фигур, поставленое к данному моменту
 
void setQueen(int row, int count)
 
{
 
  
    for(int column=0; column<n; ++column)///двигаемся по столбцу сверху вниз
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    {
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <cstring>
 +
#include <iostream>
 +
#include"math.h"
 +
#include <fstream>
 +
using namespace std;
 +
 
 +
int M, N; // M-размер доски, N-коичество шахмат.
 +
int    sum;//нужно в процессе для подсчета количества шахмат
 +
int **ChessBoard= new int* [M];
  
        if(tryQueen(row, column))/// проверка, если поставить ферзя в ячейку [row][column],
+
void ChessBoards(int k) //создание доски, k-число, которое переводим в двоичную запись, чтобы отобразить на доске расстановку фигур, 1-фигура есть, 0-нет.
                                ///будет ли он единственным в этих строке, столбце и диагоналях
+
{
 +
    for (int i=0; i<M; i++) //создание массива
 +
    {
 +
        ChessBoard[i] = new int[M];
 +
    }
 +
    for (int x=(M-1); x>=0; x=x-1)//заполнение массива фигурами (переводя k в двоичную форму)
 +
    {
 +
        for (int y=(M-1); y>=0; y=y-1)
 
         {
 
         {
             mass[row][column]=1;
+
             ChessBoard[x][y]=(k%2);
 +
            k=k/2;
 +
        }
 +
    }
 +
}
 +
void print (char filename[] ) ///создание функции вывода массива в файл
 +
    {
 +
        ofstream fout(filename, ios::app);
  
             if(count+1==figura) /// нужное количество фигур поставлено
+
        for (int x=0; x<M; ++x)
 +
        {
 +
             for(int y=0; y<M; ++y)
 
             {
 
             {
                 output_mass(); /// вызов функции вывода массива на экран
+
                 fout << ChessBoard[x][y]<<" "; ///вывод массива в файл
                zapis("Zapis");///записываем в файл
 
 
             }
 
             }
 
+
             fout <<'\n';
             else
 
            {
 
                for(int i = row + 1; i<n; i++)/// ставим следующего ферзя в одну из следующих строк
 
                setQueen(i,count+1);///и повторяем цикл
 
            }
 
 
 
            mass[row][column]=0;
 
  
 
         }
 
         }
 +
        fout <<"\n\n";
  
 +
        fout.close();
 
     }
 
     }
  
}
 
  
bool tryRook(int a, int b)///проверка на наличие фигур по вертикали и горизонтали
 
{
 
  
    if (!isEmptyHorisontal(a) || !isEmptyVertical(b))///если не выполняются эти условия,
+
bool CheckHorse(int x, int y)//проверка для коня в клетке с номером x, y
                                                    ///т.е. постановка фигуры не удовлетворяет расстановке
 
                                                    ///по горизонтали, или по вертикали
 
    return false;///неверно
 
 
 
    return true;///в остальных случаях верно
 
 
 
}
 
 
 
/// функция поиска результатов решений.
 
/// row - номер очередной строки в которую нужно поставить очередную ладью
 
/// count - количество фигур, поставленое к данному моменту
 
void setRook(int row, int count)
 
 
{
 
{
  
     for(int column=0; column<n; ++column)///двигаемся по столбцу сверху вниз
+
     if (((x+1)<M) && ((y+2)<M) && (ChessBoard[x+1][y+2]==1))//если в клетке, куда может сходить конь (х+1,у+2) уже есть фигура, то этот вариант не подходит, так как один конь бьет другого.
 
     {
 
     {
 +
        return false;
  
        if(tryRook(row, column))/// проверка, если поставить ладью в A[row][column], будет ли она единственной в этих строке и столбце
+
    }
        {
+
    else if (((x+1)<M ) && ((y-2)>=0) && (ChessBoard[x+1][y-2]==1))//то же самое и в остальных случаях проверяем бьет ли один конь другого.
 
+
    {
            mass[row][column]=1;
+
        return false;
 
 
            if(count+1==figura) /// нужное количество фигур поставлено
 
            {
 
                output_mass(); /// вызов функции вывода массива на экран
 
                zapis("Zapis");///записываем в файл
 
            }
 
 
 
            else
 
            {
 
                for(int i = row + 1; i<n; i++)/// ставим следующую ладью в одну из следующих строк
 
                setRook(i,count+1);///и повторяем цикл
 
            }
 
 
 
            mass[row][column]=0;
 
 
 
        }
 
  
 
     }
 
     }
 
+
    else if (((x-1)>=0) && ((y+2)<M) && (ChessBoard[x-1][y+2]==1))
}
+
    {
 
+
        return false;
bool tryElephant(int a, int b) ///проверка на наличие фигур по диагоналям.
+
     }
{
+
    else if (((x-1)>=0) && ((y-2)>=0) && (ChessBoard[x-1][y-2]==1))
 
 
    if (!isEmptyDiagonales(a,b))///если не выполняется это условие,
 
                                ///т.е. постановка фигуры не удовлетворяет расстановке по диагоналям
 
    return false;
 
 
 
     return true;
 
 
 
}
 
 
 
/// функция поиска результатов решений.
 
/// diagonale - номер диагонали в которую нужно поставить очередного слона
 
/// count - количество фигур, поставленое к данному моменту
 
void setElephant(int diagonale, int count)
 
{
 
 
 
    int a, b; /// опорная точка диагонали (крайняя левая)
 
 
 
    if (diagonale < n)///если номер диагонали меньше n
 
 
     {
 
     {
         a = diagonale;///значению а присвоить значенье номера диагонали
+
         return false;
        b = 0;///значению b присвоить значение 0
 
 
     }
 
     }
 
+
     else if (((x+2)<M) && ((y+1)<M) && (ChessBoard[x+2][y+1]==1))
     else///иначе
 
 
     {
 
     {
         a = n-1;///значению а присвоить значение n-1
+
         return false;
        b =(diagonale % n)+1;///значению b присвоить значение целого частного от деления номера диагонали на n прибавив к нему 1
 
 
     }
 
     }
 
+
     else if (((x+2)<M ) && ((y-1)>=0) && (ChessBoard[x+2][y-1]==1))
     /// перебираем все "столбцы" текущей диагонали
 
    for(int dcolumn=0; a-dcolumn>=0 && b+dcolumn < n; ++dcolumn)
 
 
     {
 
     {
 
+
         return false;
        /// рассчёт координат клетки по координатам крайней точки диагонали и "столбца" в диагонали
+
    }
         int x = a-dcolumn;
+
    else if (((x-2)>=0 ) && ((y+1)<M) && (ChessBoard[x-2][y+1]==1))
        int y = b+dcolumn;
+
    {
 
+
        return false;
        if(tryElephant(x, y))/// проверка, если поставить слона в A[row][column], будет ли он единственным по диагоналям
+
    }
        {
+
    else if (((x-2)>=0 ) && ((y-1)>=0) && (ChessBoard[x-2][y-1]==1))
 
+
    {
            mass[x][y]=1;
+
         return false;
 
+
    }
            if(count+1==figura) /// нужное количество фигур поставлено
+
    else //в итоге, если конь, стоящий в данной клетке никого не бьет, то этот вариант подходит
            {
+
    {
                output_mass(); /// вызов функции вывода массива на экран
+
        return true;
                zapis("Zapis");///запись в файл
 
            }
 
 
 
            else
 
            {
 
                for(int i = diagonale + 1; i<2*n-1; i++)/// ставим следующего слона в одну из следующих диагоналей
 
                setElephant(i,count+1);///и повторяем цикл
 
            }
 
 
 
            mass[x][y]=0;
 
 
 
         }
 
 
 
 
     }
 
     }
 
 
}
 
}
  
/// проверка на наличие фигуры на позиции x,y
+
int Horse(int k)//k-то число которое нужно будет перевести в двоичную форму, это делается в main'е
bool isFigure(int x, int y)
+
//в этой функции считаем количество фигур, если он равно введенному  или максимальному,то доска подходит и выводится в файл (все это в main'е)
 
{
 
{
     return 0 <= x && x < n && 0 <= y && y < n && mass[x][y];
+
     for (int x=0; x<M; x++)
}
+
    {
 
+
        int y;
///проверка на наличие короля в квадрате 3 на 3
+
        for (y=0; y<M; y++)
bool tryKing(int a, int b)
+
        {
{
+
            if (ChessBoard[x][y]==1)//если в данной клетке стоит конь, то нужно проверить,
 
+
            // бьет оно кого-то или нет...
    for(int i = a-1; i <= a+1; i++)///для ячеек находящихся слева и справа от поставленного короля
+
            //если в клетке нет коня, то ее проверять не нужно
    {
+
            {
         for(int j = b-1; j <= b+1; j++)///для ячеек находящихся снизу и сверху от поставленного короля
+
                if (CheckHorse(x,y))//...делаем это с помощью этой функции,если конь в данной клетке х;у 
 +
                //никого не бьет, то прибавляем 1 к количеству шахмат на доске и считаем дальше 
 +
                {
 +
                    sum=sum+1;
 +
                }
 +
                else //а если бьет, то выходим из цикла, на данной этапе выйдем только из внуреннего
 +
                {
 +
                    sum=0;//количество фигур обнуляем
 +
                    break;
 +
                }
 +
            }
 +
        }
 +
         if (y<M)//если из внутреннего цикла вышли раньше, значит у досчитался не до конца,
 +
        //то есть он меньше своего максимального значения М
 
         {
 
         {
             if (isFigure(i,j))///если выполняется это условие
+
              
             return false;///неверно
+
             break;//тогда выходим и из внешнего цикла
 
         }
 
         }
 
     }
 
     }
 
+
     return sum; //возвращаем количество фигур
     return true;///в остальных случаях верно
 
 
 
 
}
 
}
  
///функция поиска результатов решений
+
bool CheckKing(int x, int y) //все то же самое для проверки короля, стоящего в клетке х,у
/// count - количество фигур, поставленое к данному моменту
 
///x,y - позиция, начиная с которой разрешено ставить фигуры (все предшествующие позиции уже точно определены)
 
void setKing(int count, int x, int y)
 
 
{
 
{
  
     if(count==figura)///figura - количество фигур, вводимых пользователями.
+
     if (((x+1)<M) && ((y+1)<M) && (ChessBoard[x+1][y+1])==1)//если в клетке куда может сходить король
 +
    //уже есть фигура, то клетка не подходит и т.д
 
     {
 
     {
         output_mass();/// вызов функции вывода массива на экран
+
         return false;
        zapis("Zapis");///записываем в файл
+
 
        return;
 
 
     }
 
     }
 +
    else if (((x+1)<M ) && (ChessBoard[x+1][y]==1))
 +
    {
 +
        return false;
  
     if (x == n) /// строки закончились
+
     }
         return;
+
    else if (((x+1)<M) && ((y-1)>=0) && (ChessBoard[x+1][y-1]==1))
 
+
    {
     /// обрабатываем текущую строку
+
         return false;
     for (int j=y; j<n; ++j)
+
     }
 +
     else if (((x-1)>=0) && ((y-1)>=0) && (ChessBoard[x-1][y-1]==1))
 
     {
 
     {
 
+
         return false;
         if(tryKing(x, j))
 
        {
 
            mass[x][j]=1;
 
            /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
 
            int nextX = x, nextY = j+1;
 
 
 
            if (nextY == n)///если столбец последний
 
            {
 
                nextY = 0;///идем сначала по столбцам
 
                nextX++;///к строке прибавляем 1
 
            }
 
 
 
            /// ставим следующего короля
 
            setKing(count+1,nextX,nextY);
 
            mass[x][j]=0;
 
 
 
        }
 
 
 
 
     }
 
     }
 
+
     else if (((x-1)>=0) && ((y+1)<M) && (ChessBoard[x-1][y+1]==1))
     /// обрабатываем прямоугольник ниже текущей строки
 
    for(int i=x+1; i<n; ++i)
 
 
     {
 
     {
 +
        return false;
 +
    }
 +
    else if (((x-1)>=0) &&  (ChessBoard[x-1][y]==1))
 +
    {
 +
        return false;
 +
    }
 +
    else if (((y+1)<M) && (ChessBoard[x][y+1]==1))
 +
    {
 +
        return false;
 +
    }
 +
    else if (((y-1)>=0) && (ChessBoard[x][y-1]==1))
 +
    {
 +
        return false;
 +
    }
 +
    else
 +
    {
 +
        return true;
 +
    }
 +
}
  
        for (int j=0; j<n; ++j)
+
int King(int k) //так же как и для коня, проверяем каждую клетку
        {
+
//подходит-прибавляем к количеству фигур sum единичку, нет-обнуляем сумму и выходим из цикла
 
+
{
            if(tryKing(i, j))
+
    for (int x=0; x<M; x++)
            {
+
    {
                mass[i][j]=1;
+
        int y;
                 /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
+
        for (y=0; y<M; y++)
                 int nextX = i, nextY = j+1;
+
        {
 
+
            if (ChessBoard[x][y]==1)
                 if (nextY == n)///если столбец последний
+
            {
 +
                 if (CheckKing(x,y))
 +
                 {
 +
                    sum=sum+1;
 +
                }
 +
                 else
 
                 {
 
                 {
                     nextY = 0;///идем сначала по столбцам
+
                     sum=0;
                     nextX++;///к строке прибавляем 1
+
                     break;
 
                 }
 
                 }
 
                /// ставим следующего короля
 
                setKing(count+1,nextX,nextY);
 
                mass[i][j]=0;
 
 
 
             }
 
             }
 
 
         }
 
         }
 
+
        if (y<M)
 +
        {
 +
            break;
 +
        }
 
     }
 
     }
 
+
    return sum;
 
}
 
}
  
bool tryHorse(int a, int b) ///проверка на коней по всем направлениям
+
int CheckQueen(int x, int y)///проверка для королевы, принцип тот же, королева стит в клеке x,y
{
+
///1 значит как true в bool (как в коне или короле), 0 - false
 
+
{ int returnn=1;//начала true, дальше если будет false, то return примет значение 0, а если все пдходит
    if (isFigure(a-1,b-2) || isFigure(a-1,b+2) || isFigure(a+1,b-2) || isFigure(a+1,b+2) || isFigure(a-2,b-1) || isFigure(a-2,b+1) || isFigure(a+2,b-1) || isFigure(a+2,b+1))
+
///то так и стается 1
                                                        ///если выполняются эти условия,
+
int m;
                                                        ///т.е. фигара стоит на одной из этих позиций
+
    for (m=1; m<M; m++)
        return false;///неверно
+
  { //проверяем для диагоналей
 
+
    ///если по диагонале клетки х,у стоит еще королва, то такой вариант не подходит, выходим из цикла
     return true;///в остальных случаях верно
+
     ///разбито на 4 услвия, так как если не разбивать, то клетка в кторой стоит данная королева
 
+
    ///тоже будет считаться и выходить из цикла
}
+
      if (((x+m)<M)&&((y+m)<M))
 
+
      {
///функция поиска результатов решений
+
          if (ChessBoard[x+m][y+m]==1)
/// count - количество фигур, поставленое к данному моменту.
+
          {returnn=0;
void setHorse(int count, int x, int y)
+
          break;
{
+
          }
 
+
      }
    if(count==figura)///figura - количество фигур, вводимых пользователями.
+
      if (((x-m)>=0)&&((y+m)<M))
    {
+
      {
        output_mass();/// вызов функции вывода массива на экран
+
          if (ChessBoard[x-m][y+m]==1)
        zapis("Zapis");///записываем в файл
+
          {returnn=0;
        return;
+
          break;}
    }
+
      }
 
+
      if (((x+m)<M)&&((y-m)>=0))
    if (x == n)/// строки закончились
+
      {
        return;
+
          if (ChessBoard[x+m][y-m]==1)
 
+
        {returnn=0;
    /// обрабатываем текущую строку
+
          break;}
    for (int j=y; j<n; ++j)
+
      }
    {
+
      if (((x-m)>=0)&&((y-m)>=0))
 
+
      { if (ChessBoard[x-m][y-m]==1)
        if(tryHorse(x, j))
+
          {returnn=0;
        {
+
          break;}
 
+
      }
            mass[x][j]=1;
+
      if (m!=x) ///тут считаем по вертикали и горизонтали, так как длаем в цикле для m, то m меняется
            /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
+
        ///и в какой-то момент может стать х, и тогда роверятьбуде клетку в которой стоит ДАННАЯ и выходить
            int nextX = x, nextY = j+1;
+
        ///это не нужно так что выходим только если m не равен x
 
+
        {
             if (nextY == n)///если столбец последний
+
             if (ChessBoard[m][y]==1) //если по горизонтали есть какая-о клетка, где стоит королева, то выходим
 
             {
 
             {
                 nextY = 0;///идем сначала по столбцам
+
                 returnn=0;
                 nextX++;///к строке прибавляем 1
+
                break;
 +
            }
 +
        }
 +
        if (m!=y)//то же по вертикали
 +
        {
 +
          if (ChessBoard[x][m]==1)
 +
            {
 +
                 returnn=0;
 +
                break;
 
             }
 
             }
 
            /// ставим следующего коня
 
            setHorse(count+1,nextX,nextY);
 
            mass[x][j]=0;
 
 
 
         }
 
         }
 +
  }
 +
  return returnn;
 +
}
  
    }
+
int Queen(int k)//тут также как и для коня и короля
 
+
{
    /// обрабатываем прямоугольник ниже текущей строки
+
for (int x=0; x<M; x++)
    for(int i=x+1; i<n; ++i)
 
 
     {
 
     {
 
+
        int y;
         for (int j=0; j<n; ++j)
+
         for (y=0; y<M; y++)
 
         {
 
         {
 
+
             if (ChessBoard[x][y]==1)//если в клетке королева, проверяем подходи ли она нам
             if(tryHorse(i, j))
 
 
             {
 
             {
 
+
                 if (CheckQueen(x,y))
                 mass[i][j]=1;
+
                 {
                 /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
+
                    sum=sum+1;
                int nextX = i, nextY = j+1;
+
                }
 
+
                 else
                 if (nextY == n)///если столбец последний
 
 
                 {
 
                 {
                     nextY = 0;///идем сначала по столбцам
+
                     sum=0;
                     nextX++;///к строке прибавляем 1
+
                     break;
 
                 }
 
                 }
 
                setHorse(count+1,nextX,nextY);
 
                mass[i][j]=0;
 
 
 
             }
 
             }
 
 
         }
 
         }
 
+
        if (y<M)
 +
        {
 +
            break;
 +
        }
 
     }
 
     }
 
+
    return sum;
 
}
 
}
  
int main()
+
int CheckRook(int x, int y)///ладья, просто берем ту часть из проверки королевы, где проверка по горизонтали и вертикали
{
+
{ int returnn=1;
     setlocale(LC_ALL,"RUS");
+
int m;
 +
     for (m=0; m<M; m++)
  
  ofstream Zapis("Zapis", ios::trunc);///сохраняем в файл
 
  Zapis.close();
 
 
    do
 
 
     {
 
     {
         cout << "Введите размер доски (четный): ";
+
         if (m!=x)
        cin >> n; ///ввод пользователем размера доски
+
        {
    }while (n%2 != 0);
+
            if (ChessBoard[m][y]==1)
 +
            {
 +
                returnn=0;
 +
                break;
 +
            }
 +
        }
 +
        if (m!=y)
 +
        {
 +
          if (ChessBoard[x][m]==1)
 +
            {
 +
                returnn=0;
 +
                break;
 +
            }
 +
        }
 +
    }
  
    mass=create_mass(n); ///создаём двумерный массив
 
  
    cout<<"Queen-1, Rook-2, Elephant-3, King-4, Horse-5"<< endl;
+
      return returnn;
    cin >> figureID; ///выбор пользователем фигуры
+
}
  
    /// устанавливаем максимальное количество в зависимости от фигуры
+
int Rook(int k)//все то же самое, количество фигур на доске
    if (figureID==1)
+
{
    maxCount=n;
+
     for (int x=0; x<M; x++)
     if (figureID==2)
 
    maxCount=n;
 
    if (figureID==3)
 
    maxCount=2*n-2;
 
    if (figureID==4)
 
    maxCount=(n*n)/4;
 
    if (figureID==5)
 
    maxCount=(n*n)/2;
 
 
 
    /// запрашиваем количество фигур
 
    do
 
 
     {
 
     {
         cout << "Введите количество фигур (максимальное количество - " << maxCount << "): ";
+
         int y;
         cin >> figura;
+
        for (y=0; y<M; y++)
    }while (figura>maxCount);
+
         {
 +
            if (ChessBoard[x][y]==1)
 +
            {
 +
                if (CheckRook(x,y)==1)
 +
                {
 +
                    sum=sum+1;
  
    /// запускаем перебор
+
                }
    if (figureID==1)
+
                else
    {
+
                {
        for(int i = 0; i<n; i++)
+
                    sum=0;
         setQueen(i,0);
+
                    break;
         zapis("Zapis");
+
                }
 +
            }
 +
        }
 +
         if (y<M)
 +
        {
 +
            break;
 +
         }
 
     }
 
     }
    if (figureID==2)
+
 
    {
+
     return sum;
        for(int i = 0; i<n; i++)
 
        setRook(i,0);
 
        zapis("Zapis");
 
    }
 
    if (figureID==3)
 
    {
 
        for(int i = 0; i<2*n-1; i++)
 
        setElephant(i,0);
 
        zapis("Zapis");
 
    }
 
    if (figureID==4)
 
    {
 
        setKing(0,0,0);
 
        zapis("Zapis");
 
    }
 
    if (figureID==5)
 
    {
 
        setHorse(0,0,0);
 
        zapis("Zapis");
 
    }
 
     system("PAUSE");
 
 
}
 
}
</syntaxhighlight>
 
</div>
 
  
'''[[Васильева Анастасия]]'''
+
int CheckElephant(int x, int y)//для слона берем ту часть прроверки королевы, где по диагонали
 
+
{ int returnn=1;
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива, по ходу программы, в зависимости от алгоритмов для разных фигур, функции заполняют доску числами  0-место свободно, 1-находится под ударом и 2-занято фигурой, потом массив преобразовывается к нормальному виду 0 и 1-фигура. Так программа прогоняет все возможные варианты расстановок. Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
+
  for (int i=1; i<M; i++)
 
+
  {
'''Инструкция''': Сначала программа просит выбрать фигуру, с которой будем работать. Затем 2 варианта развития событий: 1 - вывод в файл всех расстановок, 2 - максимальное количество фигур. В зависимости от выбора, в первом случае еще нужно ввести количество фигур, и программа запишет в файл все возможные варианты и выведет на экран число расстановок, а во втором - на экране появится максимальное кол-во фигур.
+
      if (((x+i)<M)&&((y+i)<M))
Скачать можно [http://tm.spbstu.ru/Файл:Задача1.zip тут].
+
      {
 
+
          if (ChessBoard[x+i][y+i]==1)
 
+
          {returnn=0;
'''[[Гильманов Илья]]'''
+
          break;
 
+
          }
'''Основная идея программы''': пользователь вводит размер доски MxM , тип фигур, их количество. Программа рассчитывает максимально возможное количество фигур , которые можно расположить на доске, чтобы они не били друг друга.
+
      }
 +
      if (((x-i)>=0)&&((y+i)<M))
 +
      {
 +
          if (ChessBoard[x-i][y+i]==1)
 +
          {returnn=0;
 +
          break;}
 +
      }
 +
      if (((x+i)<M)&&((y-i)>=0))
 +
      {if (ChessBoard[x+i][y-i]==1)
 +
        {returnn=0;
 +
          break;}
 +
      }
 +
      if (((x-i)>=0)&&((y-i)>=0))
 +
      { if (ChessBoard[x-i][y-i]==1)
 +
          {returnn=0;
 +
          break;}
 +
      }
 +
  }
 +
  return returnn;
 +
}
  
'''Инструкция к программе''': Пользователь вводит размер доски M(size*size).А затем предоставляется выбор между нахождением максимально возможного числа фигур , и их расстановкой.Также пользователь выбирает тип фигуры , и количество(если интересует расстановка).
+
int Elephant(int k)///считаем кличесво фигур  
 
+
{
Скачать можно [http://mech.spbstu.ru/File:CheEeeSss.rar здесь]
+
for (int x=0; x<M; x++)
 
+
    {
'''[[Демченко Артём]]'''
+
        int y;
 
+
        for (y=0; y<M; y++)
'''Основная идея программы''': Программа подсчитывает и выводит расстановку указанного кол-ва фигур на указанном поле и второй опицей выводит максимальную расстановку на поле размером size*size.
+
        {
 
+
            if (ChessBoard[x][y]==1)
'''Инструкция''': Запустите программу и следуйте инструкциям. Сначала идет выбор алгоритма, после чего идет выбор фигуры и размер доски для подсчета максимальной расстановки на поле size*size. Результат будет выведен на экран.
+
            {
 
+
                if (CheckElephant(x,y))
Скачать можно [http://tm.spbstu.ru/File:Chessss.zip тут].
+
                {
 
+
                    sum=sum+1;
'''[[Иванова Яна]]'''
+
                }
 +
                else
 +
                {
 +
                    sum=0;
 +
                    break;
 +
                }
 +
            }
 +
        }
 +
        if (y<M)
 +
        {
 +
            break;
 +
        }
 +
    }
 +
    return sum;
 +
}
  
'''Краткое описание алгоритма''': Функция, которая выполняет поиск расстановок, пытается поставить фигуру в каждую клетку. В случае неудачи программа отмечает клетки, в которых фигура уже побывала, но постановка не удалась, отрицательной величиной, равной по модулю шагу, на котором эта постановка была испробована. В случае пустой клетки она отмечается нулем, в случае успеха клетка отмечается положительным числом, равным шагу, соответствующему попытке постановки.
+
int main ()
Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
+
{
 +
    ofstream MyFile("MyFile", ios::trunc);
 +
    MyFile.close(); // очищаем файл, чтоб при новой записи не было из рошлого запуска
  
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры.
+
int figure, z;
Если он выбирает максимальное число расстановок, то программа выводит их количество, а также предлагает вывести все расстановки на экран. Другой вариант работы программы - вывод расстановок N фигур.
+
    cout<<"enter a figure 1-queen, 2-king, 3-rook , 4-horse or 5-elephant ";
 +
    cin>>figure;///тип фигуры, 1 - королевА, 2-король,3-ладья,4-конь,6-слон
 +
      cout << "\n enter a size of a board M - even number ";///ввести ЧЕТНЫЙ размер доски М
 +
    cin >> M;
 +
    if ( M%2 != 0)///проверка М на четность, с помощью остатка от деления на 2
 +
    {
 +
        while (M%2 != 0)
 +
        {
 +
            cout<<" you need EVEN number, enter one more time ";
 +
            cin>>M;
 +
        }
 +
    }
  
Посмотреть программу можно [http://tm.spbstu.ru/Файл:chess(1).zip здесь]
+
    cout<<"\n choose  1- max amount or 2 - your amount of figures ";
 +
    cin>>z;///z-один из вариантов 1-максимаьное число фигур на доске,2-пользователь сам вводит
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
    switch (figure)///выбираем фигуру
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
    {
 
+
     case 1:///королева
#include <iostream>
+
     {
#include <algorithm>
+
         if (z==2)///пользоватеь сам вводит количество
#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)
 
 
         {
 
         {
             size_ = size;
+
             cout<<"\n enter an amount of figures ";
             clean_board();
+
            cin >> N;///ввести количество
        }
+
             if (N>M)///проверка на то, сможет ли такое количество уместиться на доске в правильном виде
 
+
            {
        else
+
                while (N>M)
        {
+
                {
            std::cout << "wrong size" << std::endl;
+
                    cout<<" too many figures, enter one more time ";
             throw std::string("wrong size");
+
                    cin>>N;
 +
                }
 +
            }
 +
            ///вот ниже i- те числа которые нужно перевести в двоичную форму
 +
            for (int i=0; i<=pow(2,(M*M)); i++)///каждый i-новый вариант расстановик фигур
 +
             {
 +
                sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (Queen(k)==N)///если в данной варианте фигур столько. сколько ввел пользователь, то выводим
 +
                {
 +
                    print("MyFile");
 +
                }
 +
            }
 
         }
 
         }
    }
+
        else ///вариант максимального числа фигур на доске
 
+
         {  ///так же как и в предыдущем пункте, только количество фигур N максимально,
 
+
            /// в случае королевы оно равно размеру доски 
    // функция очистки доски (занулить все клетки)
+
            N=M;
    void clean_board()
+
             for (int i=0; i<=pow(2,(M*M)); i++)
    {
 
        //обнулить счетчик количества фигур на доске
 
         figures_on_board_ = 0;
 
        //присвоить всем клеткам значение 0
 
        for (int i = 0; i < size_; ++i)
 
        {
 
             for (int j = 0; j < size_; ++j)
 
 
             {
 
             {
                 board_[i][j] = 0;
+
                 sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (Queen(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 
             }
 
             }
 
         }
 
         }
    }
 
  
    // функция, принимающая размер доски
+
         break;
    int get_size()
 
    {
 
         return size_;
 
 
     }
 
     }
     // функция, обновляющая количество фигур на доске
+
     case 2:///то же самое для короля
    int get_figures_number()
 
 
     {
 
     {
        return figures_on_board_;
+
         if (z==2)
    }
 
 
 
    //функция, пытающаяся поставить фигуру на свободное место и возвращающая
 
    //истину в случае успеха и ложь в случае неудачи
 
    bool put_figure (const figure_type& figure, const int& x, const int& y, const int& step)
 
    {
 
         if (board_[x][y] > 0 || board_[x][y] < -step)
 
 
         {
 
         {
          //если здесь уже стоит фигура или мы когда-то пытались ее сюда поставить, вернуть ложь
+
            cout<<"\n enter an amount of figures ";
             return false;
+
            cin >> N;
 +
              if ( N>(M*M)/4)
 +
            {
 +
                while (N>(M*M)/4)
 +
                {
 +
                    cout<<" too many figures, enter one more time ";
 +
                    cin>>N;
 +
                }
 +
            }
 +
            for (int i=0; i<=pow(2,(M*M)); i++)
 +
             {
 +
                sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (King(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 +
            }
 
         }
 
         }
 
+
else
        if (check_figure(figure, x, y))
 
 
         {
 
         {
             board_[x][y] = step;
+
             N=(M*M)/4;
             ++figures_on_board_;
+
             for (int i=0; i<=pow(2,(M*M)); i++)
            return true;
+
            {
        }
+
                sum=0;
        else
+
                int k=i;
        {
+
                ChessBoards(k);
             return false;
+
                if (King(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 +
             }
 
         }
 
         }
 +
        break;
 
     }
 
     }
 
+
     case 3:///для ладьи
     //отметить клетку как ранее пройденную функцией
 
    //вычесть единицу из количества фигур на доске
 
    void remove_figure(const int& x, const int& y)
 
 
     {
 
     {
         board_[x][y] *= -1;
+
         if (z==2)
        --figures_on_board_;
 
    }
 
 
 
    //функция печати доски на экран
 
    void print() const
 
    {
 
        using namespace std;
 
        cout << "==========================================" << endl;
 
        for (int i = 0; i < size_; ++i)
 
 
         {
 
         {
             for (int j = 0; j < size_; ++j)
+
             cout<<"\n enter an amount of figures ";
 +
            cin >> N;
 +
              if (N>M)
 
             {
 
             {
                 //если фигура стоит в клетке, то вывести "*", если нет - вывести "-"
+
                 while (N>M)
                 cout << (board_[i][j] > 0?"*":"-") << " ";
+
                 {
 +
                    cout<<" too many figures, enter one more time ";
 +
                    cin>>N;
 +
                }
 
             }
 
             }
            cout << endl;
 
        }
 
        cout << "==========================================" << endl;
 
    }
 
  
private:
+
            for (int i=0; i<=pow(2,(M*M)); i++)
 
+
            {
    //функция, проверяющая возможность или невозможность постановки фигуры на данную клетку
+
                 sum=0;
    bool check_figure(const figure_type& figure, const int& x, const int& y)
+
                 int k=i;
    {
+
                 ChessBoards(k);
        //выбор следующего действия в зависимости от типа фигуры
+
                 if (Rook(k)==N)
        switch (figure)
+
                {
        {
+
                    print("MyFile");
            case KING:
+
                 }
                 return check_king(x, y);
+
             }
            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;
 
 
         }
 
         }
    }
+
         else
 
 
    //поиск расстановок короля
 
    bool check_king(const int& x, const int& y)
 
    {
 
         int min_x = std::max(x - 1, 0);
 
        int max_x = std::min(x + 1, size_ - 1);
 
        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)
+
            N=M;
 +
             for (int i=0; i<=pow(2,(M*M)); i++)
 
             {
 
             {
                 if (board_[i][j] > 0)
+
                sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                 if (Rook(k)==N)
 
                 {
 
                 {
                     return false;
+
                     print("MyFile");
 
                 }
 
                 }
 
             }
 
             }
 
         }
 
         }
         return true;
+
         break;
 
     }
 
     }
 
+
     case 4:///конь
     //поиск расстановок ладьи
 
    bool check_rook(const int& x, const int& y)
 
 
     {
 
     {
         for (int i = 0; i < size_; ++i)
+
         if (z==2)
 
         {
 
         {
             if (board_[i][y] > 0)
+
             cout<<"\n enter an amount of figures ";
 +
            cin >> N;
 +
              if (N>(M*M)/2)
 +
            {
 +
                while (N>(M*M)/2)
 +
                {
 +
                    cout<<" too many figures, enter one more time ";
 +
                    cin>>N;
 +
                }
 +
            }
 +
 
 +
            for (int i=0; i<=pow(2,(M*M)); i++)
 
             {
 
             {
                 return false;
+
                 sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (Horse(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 
             }
 
             }
 
         }
 
         }
         for (int j = 0; j < size_; ++j)
+
         else
 
         {
 
         {
             if (board_[x][j] > 0)
+
             N=(M*M)/2;
 +
            for (int i=0; i<=pow(2,(M*M)); i++)
 
             {
 
             {
                 return false;
+
                 sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (Horse(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 
             }
 
             }
 
         }
 
         }
         return true;
+
         break;
 
     }
 
     }
 
+
     case 5:///слон
     //поиск расстановок слона
 
    bool check_bishop(const int& x, const int& y)
 
 
     {
 
     {
         bool check = true;
+
         if (z==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)
 
 
         {
 
         {
             check = check_coord(x + k, y + k) && check ;
+
             cout<<"\n enter an amount of figures ";
 +
            cin >> N;
 +
                if (N>2*M-2)
 +
            {
 +
                while (N>2*M-2)
 +
                {
 +
                    cout<<" too many figures, enter one more time ";
 +
                    cin>>N;
 +
                }
 +
            }
 +
            for (int i=0; i<=pow(2,(M*M)); i++)
 +
            {
 +
                sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (Elephant(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 +
            }
 
         }
 
         }
         for (int k = k_start_2; k <= k_end_2; ++k)
+
         else
 
         {
 
         {
             check = check_coord(x + k, y - k) && check;
+
             N=2*M-2;
 +
            for (int i=0; i<=pow(2,(M*M)); i++)
 +
            {
 +
                sum=0;
 +
                int k=i;
 +
                ChessBoards(k);
 +
                if (Elephant(k)==N)
 +
                {
 +
                    print("MyFile");
 +
                }
 +
            }
 
         }
 
         }
 
+
         break;
         return check;
 
 
     }
 
     }
 
+
     default : ///а это еси пользоватеь ввел цифру, которая не соответстует ни одной фигуре
 
 
     //поиск расстановок коня
 
    bool check_knight(const int& x, const int& y)
 
 
     {
 
     {
         bool check =
+
         cout<<"NOOOOO";
            check_coord(x - 2, y - 1) &&
+
         break;
            check_coord(x - 2, y + 1) &&
 
            check_coord(x - 1, y - 2) &&
 
            check_coord(x - 1, y + 2) &&
 
            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;
 
 
     }
 
     }
 +
    };
  
    //поиск расстановок королевы
+
 
    bool check_queen(const int& x, const int& y)
+
     return 0;
     {
 
        return check_rook(x, y) && check_bishop(x, y);
 
 
     }
 
     }
 +
</syntaxhighlight>
 +
</div>
  
  //функция поиска расстановок, в случае, когда на доске что-то стоит, вернуть ложь
+
'''[[Бальцер Анастасия]]'''
  //иначе поставить вернуть истину
 
    bool check_coord(const int& x, const int& y)
 
    {
 
        if (x >= 0 && x < size_ && y >= 0 && y < size_)
 
        {
 
            if (board_[x][y] > 0)
 
            {
 
                return false;
 
            }
 
        }
 
        return true;
 
    }
 
  
    // if board_[x][y] == 0
+
'''Краткое описание алгоритма''': Для каждой фигуры написана отдельная функция, выполняющая поиск расстановок. После выбора типа фигуры, соответствующая функция выполняет поиск возможных расстановок. Она проходя по строкам двумерного массива пытается поставить фигуру в каждую клетку. Проходя по массиву она маркирует клетки, ставит 0 (если клетка свободна), 1 (если клетка находится под ударом), 2 (если клетка занята). Программа аналитически считает максимальное количество фигур для заданного размера доски, возможное число расстановок для заданных типа фигуры, размера доски и количества фигур.
    //    клетка свободна
+
 
    // if board_[x][y] == s
+
'''Инструкция''': При запуске программы появляется меню, в котором каждому типу фигуры сопоставлен номер, с помощью которого пользователь и выбирает тип фигуры. Затем пользователю на выбор предлагается 2 режима работы программы: первый выводит число возможных расстановок на экран, а список возможных расстановок в отдельный файл (при этом пользователь дополнительно выбирает число фигур); второй выводит на экран максимальное число фигур выбранного типа, которые можно расставить на заданной доске.
    //    фигура была поставлена на шаге S
+
 
    // if board_[x][y] == -s
+
Посмотреть программу можно [http://tm.spbstu.ru/Файл:Расстановка.zip тут]
    //    клетка свободна, но была попытка поставить фигуру на шаге S
+
 
    int board_[MAX_SIZE][MAX_SIZE];
+
 
    int size_;
+
 
    int figures_on_board_;
+
'''[[Васильева Анастасия]]'''
};
+
 
 +
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива, по ходу программы, в зависимости от алгоритмов для разных фигур, функции заполняют доску числами  0-место свободно, 1-находится под ударом и 2-занято фигурой, потом массив преобразовывается к нормальному виду 0 и 1-фигура. Так программа прогоняет все возможные варианты расстановок. Также программа аналитически просчитывает максимальное количество фигур для каждого размера доски.
 +
 
 +
'''Инструкция''': Сначала программа просит выбрать фигуру, с которой будем работать. Затем 2 варианта развития событий: 1 - вывод в файл всех расстановок, 2 - максимальное количество фигур. В зависимости от выбора, в первом случае еще нужно ввести количество фигур, и программа запишет в файл все возможные варианты и выведет на экран число расстановок, а во втором - на экране появится максимальное кол-во фигур.
 +
Скачать можно [http://tm.spbstu.ru/Файл:Задача1.zip тут].
 +
 
 +
'''[[Белоусова Екатерина]]'''
 +
 
 +
'''Краткое описание алгоритма''': доска представлена в виде динамического массива, заполненного 1 и 0. 1-стоит фигура, 0-пустое место. Программа при помощи рекурсии вызывает функцию, которая ставит фигуру в пустую клетку и проверяет, находится ли эта фигура под ударом других.
 +
 
 +
'''Инструкция''': пользователь вводит четный размер доски М*М, затем выбирает, какую фигуру он хочет расставить на этой доске, после чего ему предлагается выбрать количество фигур(в скобках указывается максимальное количество фигур, которые можно расставить на доске М*М).Программа выводит на экран всевозможные расстановки, пронумеровывая каждую, и сохраняет их в файл.
  
//функция расчета максимума для любой доски в зависимости от типа фигуры
+
Скачать можно  [http://tm.spbstu.ru/Файл:задача_1.zip тут].
int get_max_figures (const figure_type& figure, const int& size)
 
{
 
    switch (figure)
 
    {
 
        case KING:
 
            return (size + 1) / 2;
 
        case QUEEN:
 
            if (size <= 2)
 
            {
 
                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;
 
    }
 
}
 
  
//функция для расстановки максимального числа фигур на доске
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
void place_figures_for_max(chess_board &board, const figure_type& figure, const int& max_figures, int step)
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
{
+
#include <iostream>
    ++step;
+
#include <stdlib.h>
     const int size = board.get_size();
+
#include <stdio.h>
     for (int i = 0; i < size; ++i)
+
#include <string>
     {
+
#include <cstring>
         for (int j = 0; j < size; ++j)
+
#include <fstream>
         {
+
#include <locale.h>
            //если мы можем поставить фигуру, то добавляем к максимуму единицу и запускаем цикл снова
+
#include<iomanip>
            if (board.put_figure(figure, i, j, step))
+
#include<math.h>
            {
+
 
                //если число фигур на доске достигло максимума, то вывести доску
+
using namespace std;
                if (board.get_figures_number() == max_figures)
+
 
                {
+
 
                    board.print();
+
int n, figureID, figura, maxCount; /// n - размер доски, figureID - номер фигуры, figura - колическтво фигур, maxCount - максимальное возможное количество фигур
                }
+
int results_count = 0; /// определяем тип и задаем начальное значение results_count(номер результата)
                //если число фигур не достигло максимума, продолжить выполнение функции
+
int **mass; /// определяем двумерный массив
                else
+
 
                {
+
///создаем массив размером n*n
                    place_figures_for_max(board, figure, max_figures, step);
+
int** create_mass(int n)
                }
+
{
                board.remove_figure(i, j);
+
 
            }
+
     int **mass = new int* [n];
        }
+
     for (int a=0; a<n; ++a)
 +
     {
 +
         mass[a] = new int [n];
 +
         memset((char*)mass[a],0,n*sizeof(int)); ///зануление массива
 
     }
 
     }
 +
 +
        return mass;
 +
 
}
 
}
  
//функция, принимающая ввод с клавиатуры как строковый тип данных
+
///функция вывода массива
figure_type get_figure_type(const std::string& str)
+
void output_mass ()
 
{
 
{
    using namespace std;
 
  
     figure_type figure;
+
     for (int a=0; a<n; ++a)///заполнение ячеек массива от 0 до n по горизонтали
    if (str == string("king"))
 
 
     {
 
     {
         figure = KING;}
+
 
    else if (str == string("queen"))
+
         for(int b=0; b<n; ++b)///заполнение ячеек массива от 0 до n по вертикали
    {
+
         {
        figure = QUEEN;}
+
            cout << mass[a][b]<<" "; ///вывод массива на экран
    else if (str == string("rook"))
+
        }
    {
+
 
         figure = ROOK;
+
         cout << '\n';
    }
+
 
    else if (str == string("bishop"))
 
    {
 
        figure = BISHOP;
 
    }
 
    else if (str == string("knight"))
 
    {
 
      figure = KNIGHT;
 
    }
 
    //вывести ошибку в случае неверного ввода
 
    else
 
    {
 
         cout << "wrong figure type" << endl;
 
        throw string("wrong figure type");
 
 
     }
 
     }
  
     return figure;
+
     cout << "Result #" << ++results_count <<"\n\n"; /// вывод номера результата
 +
 
 
}
 
}
  
int main()
+
void zapis (char Zapis[] ) ///функции записи решений в файл
 
{
 
{
     //использовать стандартное пространств имен
+
     ofstream fout(Zapis, ios::app);///запись в фаил "Zapis"
    using namespace std;
 
  
     int size;
+
     for (int x=0; x<n; ++x)///заполнение ячеек массива от 0 до n по горизонтали
     string type_of_figure;
+
     {
    string type_of_action;
+
        for(int y=0; y<n; ++y)///заполнение ячеек массива от 0 до n по вертикали
    figure_type figure;
+
        {
 
+
            fout<< mass[x][y]<<" "; ///вывод решений в файл
    cout << "Возможные фигуры: king, queen, rook, bishop, knight" << endl;
+
        }
     cout << "Возможные действия: max, placing" << endl;
+
        fout<<'\n';
     cout << "----------------------------------------------------" << endl;
+
     }
 +
    fout<<"\n\n";
 +
     fout.close();
 +
}
  
    cout <<"Введите размер доски: ";
+
///проверяем наличие фигуры в строке а
    cin >> size;
+
bool isEmptyHorisontal(int a)
    chess_board board(size);
+
{
  
     cout << "Введите тип фигуры: ";
+
     for(int i=0; i<n; ++i)///создаем цикл от 0 до n
     cin >> type_of_figure;
+
     {
    figure = get_figure_type(type_of_figure);
+
        if(mass[a][i])///в каждой ячейке массива [a][i]
 +
        {
 +
            return false;///неверно
 +
        }
 +
    }
  
     cout << "Введите необходимое действие: ";
+
     return true;///в остальных случаях верно
    cin >> type_of_action;
 
  
    if (type_of_action == string("max"))
+
}
    {
 
  
        int max_figures = get_max_figures(figure, size);
+
///проверяем наличие фигур в столбце b
        cout << "Max figures: " << max_figures << endl;
+
bool isEmptyVertical(int b)
 +
{
  
        cout << "Хотите ли вы просмотреть все варианты? (yes/no) ";
+
    for(int i=0; i<n; ++i)///создаем цикл от 0 до n
        string answer;
+
    {
        cin >> answer;
+
         if(mass[i][b])///в каждой ячейке массива [i][b]
        //если нужно вывести все расстановки, то применить непосредственно функцию поиска расстановок максимума
 
         if (answer == string("yes"))
 
 
         {
 
         {
             int step = 0;
+
             return false;///неверно
            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;
+
    return true;///в остальных случаях верно
        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;
 
 
}
 
}
  
 +
///проверяем наличие фигур на диагоналях
 +
bool isEmptyDiagonales(int a, int b)
 +
{
  
</syntaxhighlight>
+
    for(int i=1; a-i>=0 && b-i>=0; ++i)///диагональ влево-вверх
</div>
+
    {
 +
        if(mass[a-i][b-i])///в каждой ячейке массива [a-i][b-i]
 +
        {
 +
            return false;///неверно
 +
        }
 +
    }
  
 +
    for(int i=1; a+i<n && b+i<n; ++i)///диагональ вправо-вниз
 +
    {
 +
        if(mass[a+i][b+i])///в каждой ячейке массива [a+i][b+i]
 +
        {
 +
            return false;///неверно
 +
        }
 +
    }
  
 +
    for(int i=1; a+i<n && b-i>=0; ++i)///диагональ влево-вниз
 +
    {
 +
        if(mass[a+i][b-i])///в каждой ячейке массива [a+i][b-i]
 +
        {
 +
            return false;///неверно
 +
        }
 +
    }
  
'''[[Капитанюк Светлана]]'''
+
    for(int i=1; a-i>=0 && b+i<n; ++i)///диагональ вправо-вверх
 +
    {
 +
        if(mass[a-i][b+i])///в каждой ячейке массива [a-i][b+i]
 +
        {
 +
            return false;///неверно
 +
        }
 +
    }
  
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива. Если в клетке присутствует фигура, то тогада она обозначается '+', если же клетка осталась путсая, то тогда '0'.
+
        return true;///в остальных случаях верно
  
'''Инструкция''': Инструкция: при запуске программа предлагает пользователю ввести размер доски, при этом число должно быть четным (если же пользователь вводит нечетное число, программа предлагает ввести размер еще раз, и так до тех пор, пока не будет введено четное число). Далее пользователь выбирает режим работы программы - либо расстановка фигур, либо расчет максимального количества фигур. В режиме расстановки фигур программа предлагает выбрать тип фигуры, выводит максимальное число фигур для доски заданного размера и предлагает ввести желаемое число фигур для расстановки (если оно больше максимального, предлагается повторная попытка ввода). В режиме расчета максимального числа программа предлагает выбрать тип фигуры, выводит рассчитанное число и задает вопрос о необходимости вывода всех возможных расстановок максимального количества для данной фигуры. Оба режима работают (т.е. все запросы повторяются) до тех пор, пока пользователь не даст команду на завершение цикла. Кроме того, в программе есть возможность изменения размера доски после выхода из всех циклов. При положительном ответе пользователя и изменении размера доступны оба режима работы.
+
}
  
Скачать можно  [http://tm.spbstu.ru/File:Chess_03.zip тут].
+
///проверяем наличие фигур по горизонтали, вертикали и диагоналям
 +
bool tryQueen(int a, int b)
 +
{
  
'''[[Киселёв Лев]]'''
+
    if (!isEmptyHorisontal(a) || !isEmptyVertical(b) || !isEmptyDiagonales(a,b))///если не выполняются эти условия,
 +
                                                                                ///т.е. постановка фигуры не удовлетворяет расстановке
 +
                                                                                ///по горизонтали, или по вертикали, или по диагонали
 +
    return false;///неверно
  
'''Основная идея программы''': реализация задачи о расстановке фигур одинакового типа на произвольной доске MxM
+
    return true;///в остальных случаях верно
Скачать можно [http://mech.spbstu.ru/File:main.rar здесь]
 
  
'''[[Козловская Анна]]'''
+
}
  
'''Краткое описание алгоритма:''' Доска представлена в виде динамического массива[m;m], при выводе на экран пустые клетки обозначаются звездочками,а клетки, заполненные фигурами-буквами(каждая буква соответствует первой букве названия фигуры на английском языке). Для всех фигур написаны алгоритмы проверки на возможность расстановки фигуры. После выбора типа фигуры,используется рекурсивная функция,которая проверяет возможные расстановки через данную функцию проверки ,для данного типа фигуры. Во втором варианте работы программы,она аналитически высчитывает максимально возможное количество заданных фигур на доске.В программу встроена функция,проверяющая доску на повторные и симметричные относительно всех осей симметрии способы расстановки фигур.
+
/// функция поиска результатов решений.
 +
/// row - номер очередной строки в которую нужно поставить очередного ферзя.
 +
/// count - количество фигур, поставленое к данному моменту
 +
void setQueen(int row, int count)
 +
{
  
'''Инструкция:''' В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры и кол-во фигур(для первого типа работы программы).Если он выбирает первый вариант работы программы  - вывод всех различных расстановок N фигур.Другой вариант работы программы максимальное число расстановок- программа выводит их количество.
+
    for(int column=0; column<n; ++column)///двигаемся по столбцу сверху вниз
 +
    {
  
Скачать можно  [http://tm.spbstu.ru/File:Chess3.rar тут].
+
        if(tryQueen(row, column))/// проверка, если поставить ферзя в ячейку [row][column],
 +
                                ///будет ли он единственным в этих строке, столбце и диагоналях
 +
        {
 +
            mass[row][column]=1;
  
'''[[Лебедев Станислав]]'''
+
            if(count+1==figura) /// нужное количество фигур поставлено
 +
            {
 +
                output_mass(); /// вызов функции вывода массива на экран
 +
                zapis("Zapis");///записываем в файл
 +
            }
  
'''Функционал программы''': получение всевозможных расстановок n однотипных шахматных фигур первой линии на поле n на n,таких,чтобы фигуры не били друг друга(считается,что фигуры одного цвета также могут бить друг друга) или получения максимального количества фигур первой линии,которые могут стоять на доске n*n;
+
            else
 +
            {
 +
                for(int i = row + 1; i<n; i++)/// ставим следующего ферзя в одну из следующих строк
 +
                setQueen(i,count+1);///и повторяем цикл
 +
            }
 +
 
 +
            mass[row][column]=0;
 +
 
 +
        }
 +
 
 +
    }
  
'''Идея алгоритма''': рекурсивно вызывается функция,которая ставит фигуру в пустую и небитую клетку, а также отмечает клетки,которые эта фигура бьет. Рекурсия продолжается до тех пор,пока либо не будет достигнуто нужное количество, либо не будет возможности поставить фигуру. После выхода из рекурсии начинается "обратный ход", в котором отмеченные как битые на этом шаге,"размечаются"(снимается отметка,что эта клетка бьется),а место,занятое самой фигурой, запоминается.
+
}
  
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
+
bool tryRook(int a, int b)///проверка на наличие фигур по вертикали и горизонтали
 +
{
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
    if (!isEmptyHorisontal(a) || !isEmptyVertical(b))///если не выполняются эти условия,
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
                                                    ///т.е. постановка фигуры не удовлетворяет расстановке
#include <iostream>
+
                                                    ///по горизонтали, или по вертикали
#include <math.h>
+
    return false;///неверно
#include <cmath>
 
  
using namespace std;
+
    return true;///в остальных случаях верно
  
int n,type, *a, *stak, variant, maxst = 0;
+
}
  
void king(int x, int &top)                     //отметить битые клетки королем
+
/// функция поиска результатов решений.
 +
/// row - номер очередной строки в которую нужно поставить очередную ладью
 +
/// count - количество фигур, поставленое к данному моменту
 +
void setRook(int row, int count)
 
{
 
{
    // 012
 
    // 345
 
    // 678
 
  
     //0
+
     for(int column=0; column<n; ++column)///двигаемся по столбцу сверху вниз
    if (((x % n) > 1) && ((x / n) > 1))
 
 
     {
 
     {
        int ii = x - n - 1;
+
 
         if (a[ii] != -2)
+
         if(tryRook(row, column))/// проверка, если поставить ладью в A[row][column], будет ли она единственной в этих строке и столбце
 
         {
 
         {
             a[ii]++;
+
 
             stak[top] = ii;
+
             mass[row][column]=1;
            top++;
+
 
 +
            if(count+1==figura) /// нужное количество фигур поставлено
 +
            {
 +
                output_mass(); /// вызов функции вывода массива на экран
 +
                zapis("Zapis");///записываем в файл
 +
            }
 +
 
 +
            else
 +
            {
 +
                for(int i = row + 1; i<n; i++)/// ставим следующую ладью в одну из следующих строк
 +
                setRook(i,count+1);///и повторяем цикл
 +
             }
 +
 
 +
            mass[row][column]=0;
 +
 
 
         }
 
         }
    }
 
  
    //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
+
bool tryElephant(int a, int b) ///проверка на наличие фигур по диагоналям.
     if ((x % n) > 0)
+
{
     {
+
 
        int ii = x - 1;
+
     if (!isEmptyDiagonales(a,b))///если не выполняется это условие,
        if (a[ii] != -2)
+
                                ///т.е. постановка фигуры не удовлетворяет расстановке по диагоналям
        {
+
    return false;
            a[ii]++;
+
 
            stak[top] = ii;
+
     return true;
            top++;
+
 
        }
+
}
 +
 
 +
/// функция поиска результатов решений.
 +
/// diagonale - номер диагонали в которую нужно поставить очередного слона
 +
/// count - количество фигур, поставленое к данному моменту
 +
void setElephant(int diagonale, int count)
 +
{
 +
 
 +
    int a, b; /// опорная точка диагонали (крайняя левая)
 +
 
 +
    if (diagonale < n)///если номер диагонали меньше n
 +
    {
 +
        a = diagonale;///значению а присвоить значенье номера диагонали
 +
        b = 0;///значению b присвоить значение 0
 
     }
 
     }
  
     //5
+
     else///иначе
    if ((x % n) < (n - 1))
 
 
     {
 
     {
         int ii = x + 1;
+
         a = n-1;///значению а присвоить значение n-1
         if (a[ii] != -2)
+
         b =(diagonale % n)+1;///значению b присвоить значение целого частного от деления номера диагонали на n прибавив к нему 1
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
 
     }
 
     }
  
     //6
+
     /// перебираем все "столбцы" текущей диагонали
     if (((x % n ) > 0) && ((x / n) < (n - 1)))
+
     for(int dcolumn=0; a-dcolumn>=0 && b+dcolumn < n; ++dcolumn)
 
     {
 
     {
         int ii = x + n - 1;
+
 
         if (a[ii] != -2)
+
        /// рассчёт координат клетки по координатам крайней точки диагонали и "столбца" в диагонали
 +
        int x = a-dcolumn;
 +
         int y = b+dcolumn;
 +
 
 +
         if(tryElephant(x, y))/// проверка, если поставить слона в A[row][column], будет ли он единственным по диагоналям
 
         {
 
         {
             a[ii]++;
+
 
             stak[top] = ii;
+
             mass[x][y]=1;
            top++;
+
 
 +
            if(count+1==figura) /// нужное количество фигур поставлено
 +
            {
 +
                output_mass(); /// вызов функции вывода массива на экран
 +
                zapis("Zapis");///запись в файл
 +
            }
 +
 
 +
            else
 +
            {
 +
                for(int i = diagonale + 1; i<2*n-1; i++)/// ставим следующего слона в одну из следующих диагоналей
 +
                setElephant(i,count+1);///и повторяем цикл
 +
             }
 +
 
 +
            mass[x][y]=0;
 +
 
 
         }
 
         }
 +
 
     }
 
     }
  
    //7
+
}
     if ((x / n ) < (n - 1))
+
 
 +
/// проверка на наличие фигуры на позиции x,y
 +
bool isFigure(int x, int y)
 +
{
 +
     return 0 <= x && x < n && 0 <= y && y < n && mass[x][y];
 +
}
 +
 
 +
///проверка на наличие короля в квадрате 3 на 3
 +
bool tryKing(int a, int b)
 +
{
 +
 
 +
    for(int i = a-1; i <= a+1; i++)///для ячеек находящихся слева и справа от поставленного короля
 
     {
 
     {
         int ii = x + n;
+
         for(int j = b-1; j <= b+1; j++)///для ячеек находящихся снизу и сверху от поставленного короля
        if (a[ii] != -2)
 
 
         {
 
         {
             a[ii]++;
+
             if (isFigure(i,j))///если выполняется это условие
            stak[top] = ii;
+
             return false;///неверно
             top++;
 
 
         }
 
         }
 
     }
 
     }
  
     //8
+
     return true;///в остальных случаях верно
    if (((x % n ) < (n - 1)) && ((x / n) < (n - 1)))
+
 
    {
 
        int ii = x + n + 1;
 
    if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
    }
 
 
}
 
}
  
void bishop(int x, int &top)                                                             //отметить битые клетки слоном
+
///функция поиска результатов решений
 +
/// count - количество фигур, поставленое к данному моменту
 +
///x,y - позиция, начиная с которой разрешено ставить фигуры (все предшествующие позиции уже точно определены)
 +
void setKing(int count, int x, int y)
 
{
 
{
    //вверх влево
+
 
     for (int i = (x - (n + 1)); ((i >= 0) && ((i%n) != (n-1))); i -= (n+1))
+
     if(count==figura)///figura - количество фигур, вводимых пользователями.
 
     {
 
     {
         if (a[i] != -2)
+
         output_mass();/// вызов функции вывода массива на экран
         {
+
         zapis("Zapis");///записываем в файл
            a[i]++;
+
        return;
            stak[top] = i;
 
            top++;
 
        }
 
 
     }
 
     }
  
     //вниз вправо
+
     if (x == n) /// строки закончились
     for (int i = (x + (n + 1)); ((i < n*n) && ((i%n) != 0)); i += (n+1))
+
        return;
 +
 
 +
    /// обрабатываем текущую строку
 +
     for (int j=y; j<n; ++j)
 
     {
 
     {
         if (a[i] != -2)
+
 
 +
         if(tryKing(x, j))
 
         {
 
         {
             a[i]++;
+
             mass[x][j]=1;
             stak[top] = i;
+
            /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
            top++;
+
            int nextX = x, nextY = j+1;
 +
 
 +
            if (nextY == n)///если столбец последний
 +
            {
 +
                nextY = 0;///идем сначала по столбцам
 +
                nextX++;///к строке прибавляем 1
 +
            }
 +
 
 +
             /// ставим следующего короля
 +
            setKing(count+1,nextX,nextY);
 +
            mass[x][j]=0;
 +
 
 
         }
 
         }
 +
 
     }
 
     }
  
     //вверх вправо
+
     /// обрабатываем прямоугольник ниже текущей строки
     for (int i = x - (n - 1); ((i >= 0) && ((i%n) != 0)); i -= (n-1))
+
     for(int i=x+1; i<n; ++i)
 
     {
 
     {
         if (a[i] != -2)
+
 
 +
         for (int j=0; j<n; ++j)
 
         {
 
         {
             a[i]++;
+
 
            stak[top] = i;
+
            if(tryKing(i, j))
             top++;
+
             {
 +
                mass[i][j]=1;
 +
                /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
 +
                int nextX = i, nextY = j+1;
 +
 
 +
                if (nextY == n)///если столбец последний
 +
                {
 +
                    nextY = 0;///идем сначала по столбцам
 +
                    nextX++;///к строке прибавляем 1
 +
                }
 +
 
 +
                /// ставим следующего короля
 +
                setKing(count+1,nextX,nextY);
 +
                mass[i][j]=0;
 +
 
 +
             }
 +
 
 
         }
 
         }
 +
 
     }
 
     }
  
    //вниз влево
 
    for (int i = x + (n - 1); ((i < n*n) && ((i%n) != (n-1))); i += (n-1))
 
    {
 
        if (a[i] != -2)
 
        {
 
            a[i]++;
 
            stak[top] = i;
 
            top++;
 
        }
 
    }
 
 
}
 
}
  
void knight(int x, int &top)                                           //отметить битые клетки конем
+
bool tryHorse(int a, int b) ///проверка на коней по всем направлениям
 +
{
 +
 
 +
    if (isFigure(a-1,b-2) || isFigure(a-1,b+2) || isFigure(a+1,b-2) || isFigure(a+1,b+2) || isFigure(a-2,b-1) || isFigure(a-2,b+1) || isFigure(a+2,b-1) || isFigure(a+2,b+1))
 +
                                                        ///если выполняются эти условия,
 +
                                                        ///т.е. фигара стоит на одной из этих позиций
 +
        return false;///неверно
 +
 
 +
    return true;///в остальных случаях верно
 +
 
 +
}
 +
 
 +
///функция поиска результатов решений
 +
/// count - количество фигур, поставленое к данному моменту.
 +
void setHorse(int count, int x, int y)
 
{
 
{
     if (((x%n) > 0) && (x/n) > 1)
+
 
 +
     if(count==figura)///figura - количество фигур, вводимых пользователями.
 
     {
 
     {
         int ii = x - 2*n - 1;
+
         output_mass();/// вызов функции вывода массива на экран
         if (a[ii] != -2)
+
         zapis("Zapis");///записываем в файл
         {
+
         return;
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
 
     }
 
     }
  
     if (((x%n) > 1) && (x/n) > 0)
+
     if (x == n)/// строки закончились
 +
        return;
 +
 
 +
    /// обрабатываем текущую строку
 +
    for (int j=y; j<n; ++j)
 
     {
 
     {
        int ii = x - n - 2;
+
 
         if (a[ii] != -2)
+
         if(tryHorse(x, j))
 
         {
 
         {
             a[ii]++;
+
 
             stak[top] = ii;
+
             mass[x][j]=1;
            top++;
+
            /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
 +
            int nextX = x, nextY = j+1;
 +
 
 +
            if (nextY == n)///если столбец последний
 +
            {
 +
                nextY = 0;///идем сначала по столбцам
 +
                nextX++;///к строке прибавляем 1
 +
            }
 +
 
 +
             /// ставим следующего коня
 +
            setHorse(count+1,nextX,nextY);
 +
            mass[x][j]=0;
 +
 
 
         }
 
         }
 +
 
     }
 
     }
  
     if (((x%n) > 1) && (x/n) < (n - 1))
+
     /// обрабатываем прямоугольник ниже текущей строки
 +
    for(int i=x+1; i<n; ++i)
 
     {
 
     {
        int ii = x + n - 2;
 
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
    }
 
  
    if (((x%n) > 0) && (x/n) < (n - 2))
+
        for (int j=0; j<n; ++j)
    {
 
        int ii = x + 2*n - 1;
 
        if (a[ii] != -2)
 
 
         {
 
         {
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
    }
 
  
    if (((x%n) < (n - 1)) && (x/n) < (n - 2))
+
            if(tryHorse(i, j))
    {
+
            {
        int ii = x + 2*n + 1;
+
 
        if (a[ii] != -2)
+
                mass[i][j]=1;
        {
+
                /// смещаем разрешённую позицию на 1 вправо или в начало следующей строки
            a[ii]++;
+
                int nextX = i, nextY = j+1;
            stak[top] = ii;
+
 
             top++;
+
                if (nextY == n)///если столбец последний
 +
                {
 +
                    nextY = 0;///идем сначала по столбцам
 +
                    nextX++;///к строке прибавляем 1
 +
                }
 +
 
 +
                setHorse(count+1,nextX,nextY);
 +
                mass[i][j]=0;
 +
 
 +
             }
 +
 
 
         }
 
         }
    }
 
  
    if (((x%n) < (n - 2)) && (x/n) < (n - 1))
 
    {
 
        int ii = x + n + 2;
 
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
 
     }
 
     }
  
    if (((x%n) < (n - 2)) && (x/n) < 0)
+
}
    {
 
        int ii = x - n + 2;
 
        if (a[ii] != -2)
 
        {
 
            a[ii]++;
 
            stak[top] = ii;
 
            top++;
 
        }
 
    }
 
  
    if (((x%n) < (n - 1)) && (x/n) < 1)
+
int main()
    {
+
{
        int ii = x - 2*n + 1;
+
    setlocale(LC_ALL,"RUS");
        if (a[ii] != -2)
+
 
        {
+
  ofstream Zapis("Zapis", ios::trunc);///сохраняем в файл
            a[ii]++;
+
  Zapis.close();
            stak[top] = ii;
 
            top++;
 
        }
 
    }
 
}
 
  
void rook(int x, int &top)                                                      //отметить битые клетки ладьей
+
     do
{
 
     int k = x - (x % n);
 
    while ((k/n) == (x/n))
 
 
     {
 
     {
 +
        cout << "Введите размер доски (четный): ";
 +
        cin >> n; ///ввод пользователем размера доски
 +
    }while (n%2 != 0);
  
        if ((k != x) && (a[k] != -2))
+
    mass=create_mass(n); ///создаём двумерный массив
        {
 
            a[k]++;
 
            stak[top] = k;
 
            top++;
 
        }
 
        k ++;
 
    }
 
  
     k = (x % n);
+
     cout<<"Queen-1, Rook-2, Elephant-3, King-4, Horse-5"<< endl;
    while (((k/n)) != n)
+
    cin >> figureID; ///выбор пользователем фигуры
    {
 
        if ((k != x) && (a[k] != -2))
 
        {
 
            a[k]++;
 
            stak[top] = k;
 
            top++;
 
        }
 
        k += n;
 
    }
 
  
}
+
    /// устанавливаем максимальное количество в зависимости от фигуры
void set_figure(int x, int &top)                                   //ставим фигуры на доску
+
    if (figureID==1)
{
+
    maxCount=n;
     //отмечаем "битые" клетки
+
    if (figureID==2)
     switch (type)
+
    maxCount=n;
 +
    if (figureID==3)
 +
    maxCount=2*n-2;
 +
    if (figureID==4)
 +
    maxCount=(n*n)/4;
 +
    if (figureID==5)
 +
    maxCount=(n*n)/2;
 +
 
 +
     /// запрашиваем количество фигур
 +
     do
 
     {
 
     {
//король
+
         cout << "Введите количество фигур (максимальное количество - " << maxCount << "): ";
         case 1:
+
         cin >> figura;
         {
+
    }while (figura>maxCount);
            king(x,top);
 
            break;
 
        }
 
  
//слон
+
    /// запускаем перебор
case 2:
+
    if (figureID==1)
{
+
    {
    bishop(x,top);
+
        for(int i = 0; i<n; i++)
            break;
+
        setQueen(i,0);
}
+
        zapis("Zapis");
 
+
    }
//конь
+
    if (figureID==2)
case 3:
+
    {
{
+
        for(int i = 0; i<n; i++)
    knight(x,top);
+
        setRook(i,0);
break;
+
        zapis("Zapis");
}
+
    }
//ладья
+
    if (figureID==3)
        case 4:
+
    {
        {
+
        for(int i = 0; i<2*n-1; i++)
            rook(x,top);
+
        setElephant(i,0);
            break;
+
        zapis("Zapis");
        }
+
    }
        //ферзь
+
    if (figureID==4)
        case 5:
+
    {
        {
+
        setKing(0,0,0);
            rook(x,top);
+
        zapis("Zapis");
            bishop(x,top);
+
    }
            break;
+
    if (figureID==5)
        }
+
    {
 +
        setHorse(0,0,0);
 +
        zapis("Zapis");
 
     }
 
     }
 +
    system("PAUSE");
 +
}
 +
</syntaxhighlight>
 +
</div>
  
    //отмечаем,что в данной клетке стоит фигура
+
'''[[Тимошенко Валентина]]'''
a[x] = -1;
 
    stak[top] = x;
 
    top++;
 
}
 
  
void step(int top,int x,int st)
+
'''Краткое описание алгоритма''': доска представлена в виде динамического массива, при выводе на экран пустые клетки обозначаются точками, а клетки, заполненные фигурами, обозначаются буквами (каждая буква соответствует первой букве названия фигуры на английском языке). Для каждой фигуры написаны функции проверки на возможность установки фигуры и функции расстановки. Кроме того, программа аналитически считает максимальное количество фигур для доски заданного пользователем размера и, при наличии команды пользователя, выводит все возможные расстановки рассчитанного максимального количества фигур на экран.
{
 
int xtop = top;
 
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;
 
}
 
}
 
  
 +
'''Инструкция''': при запуске программа предлагает пользователю ввести размер доски, при этом число должно быть четным (если же пользователь вводит нечетное число, программа предлагает ввести размер еще раз, и так до тех пор, пока не будет введено четное число). Далее пользователь выбирает режим работы программы - либо расстановка фигур, либо расчет максимального количества фигур. В режиме расстановки фигур программа предлагает выбрать тип фигуры, выводит максимальное число фигур для доски заданного размера и предлагает ввести желаемое число фигур для расстановки (если оно больше максимального, предлагается повторная попытка ввода). В режиме расчета максимального числа программа предлагает выбрать тип фигуры, выводит рассчитанное число и задает вопрос о необходимости вывода всех возможных расстановок максимального количества для данной фигуры. Оба режима работают (т.е. все запросы повторяются) до тех пор, пока пользователь не даст команду на завершение цикла. Кроме того, в программе есть возможность изменения размера доски после выхода из всех циклов. При положительном ответе пользователя и изменении размера доступны оба режима работы.
  
 +
Скачать можно  [http://tm.spbstu.ru/Файл:Chessboard.zip здесь].
  
// обратный ход
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
     for (int i = xtop; i < top; i++)
+
<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) /// цикл, прогоняющий значения по строкам
 
     {
 
     {
         if ((a[stak[i]] != -1) && (a[stak[i]] != -2))
+
         for(int j = 0; j < M; ++j) /// цикл, прогоняющий значения по столбцам
            a[stak[i]]--;
+
             cout << ((Board[i][j]) ? F : "."); ///заполнение как строки, так и столбца символом, который обозначает позицию на шахматной доске
        else
+
        cout << endl;                         ///точка - если данная клетка пустая, буква - если в клетке стоит соответствующая фигура
            //не забываем отметить,что фигура уже здесь стояла(чтобы избежать повторов)
 
             if (a[stak[i]] == -1)
 
                a[stak[i]] = -2;
 
//       cerr << " Back "  << stak[i] << endl;
 
 
     }
 
     }
 +
    cout << "Result # " << ++result_count << "\n\n"; ///вывод номера варианта расположения с последующим переходом на новую строку
 +
    return;
 
}
 
}
  
int main()
+
///Функции проверки и установки для ферзя
 +
 
 +
bool tryQueen(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
{
 +
    for (int i = 0; i < M; ++i) ///проверка единственности ферзя в строке
 +
    {
 +
        if(Board[a][i])
 +
            return false;
 +
    }
  
     //cin >> n >> type >> variant;
+
     for(int i = 0; i < M; ++i) ///проверка единственности ферзя в столбце
     n = 5;
+
     {
    type = 4;
+
        if(Board[i][b])
variant = 1;
+
            return false;
    a    = new int[n*n];
+
     }
     stak = new int[n*n*4];
 
  
     for (int i = 0; i < (n*n); i++)
+
     for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вверх
 
     {
 
     {
         for (int j = 0; j < (n*n); j++)
+
         if(Board[a-i][b-i])
            a[j] = 0;
+
             return false;
        if (variant == 1)
 
             cout << "__________________________________" << endl;
 
        step(0,i,0);
 
 
     }
 
     }
if (variant == 2)
 
  cout << maxst;
 
    return 0;
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Лобанов Илья]]'''
+
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вниз
 +
    {
 +
        if(Board[a+i][b+i])
 +
            return false;
 +
    }
  
'''Описание алгоритма''':
+
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вниз
 +
    {
 +
        if(Board[a+i][b-i])
 +
            return false;
 +
    }
  
Программа проверяет возможность расстановки фигур на доске M*M . При выводе на экран на экран клетки,занятые фигурами ,помечаются буквами,соответствующими первой букве типа фигуры. Также программа считает максимальное число фигур определенного типа,которые можно расставить на доске.
+
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вверх
 +
    {
 +
        if(Board[a-i][b+i])
 +
            return false;
 +
    }
  
'''Инструкция''':
+
    return true; ///если в ходе проверки ферзей и угроз не обнаружилось, в данную клетку можно поставить фигуру
 +
}
  
В окне консоли пользователю предлагается выбрать 2 типа работы программы, затем пользователь вводит размер доски(четный),тип и количество фигур,которые необходимо разместить на доске.В зависимости от режима работы программы ,будет выведено либо максимально возможное число расстановок фигур,либо максимальное число фигур.
+
void setQueen(int a, int count) ///функция расстановки ферзей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
Скачать можно [[http://tm.spbstu.ru/File:ConsoleApplication54.rar тут]]
+
{
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
    {
#include <iostream>
+
        if(tryQueen(a, b)) ///проверка данной клетки на возможность установки фигуры
#include <windows.h>
+
        {
using namespace std;
+
            Board[a][b] = 1; ///установка ферзя в первую клетку поля, присваивание ей значения 1 (true)
 +
 
 +
            for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
 +
                setQueen(i,count+1);
 +
 
 +
            if(count+1 == N) /// если нужное количество фигур поставлено, то
 +
                showBoard("Q"); /// вызов функции вывода шахматной доски на экран
 +
 
 +
            Board[a][b]=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;
 
  
// структура для описания клектки доски
+
bool tryRook(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
struct point
 
 
{
 
{
int x, y;
+
    for (int i = 0; i < M; ++i) ///проверка единственности ладьи в строке
point(int x = 0, int y = 0): x(x), y(y) {}
+
    {
point &operator++()
+
        if(Board[a][i])
{
+
            return false;
if (y == M - 1)
+
    }
{
+
 
++x;
+
    for(int i = 0; i < M; ++i) ///проверка единственности ладьи в столбце
y = 0;
+
    {
}
+
        if(Board[i][b])
else
+
            return false;
++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;
 
}
 
};
 
  
 +
    return true; ///если в ходе проверки ладей и угроз не обнаружилось, в данную клетку можно поставить фигуру
 +
}
  
int *new_array(int n)
+
void setRook(int a, int count) ///функция расстановки ладей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
 
{
 
{
int *a = new int[n];
+
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
fill(a, a + n, NONE);
+
    {
return a;
+
        if(tryRook(a, b)) ///проверка данной клетки на возможность установки фигуры
 +
        {
 +
            Board[a][b] = 1; ///установка ладьи в первую клетку, присваивание ей значения 1 (true)
 +
 
 +
            for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
 +
                setRook(i,count+1);
 +
 
 +
            if(count+1 == N) /// если нужное количество фигур поставлено, то
 +
                showBoard("R"); /// вызов функции вывода шахматной доски на экран
 +
 
 +
            Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
        }
 +
    }
 
}
 
}
  
// Количество свободных клеток от клетки p до конца доски
+
///Функции проверки и установки для слона
int rest(const point &p, type t)
+
 
 +
bool tryEl(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
{
int r0 = (M - p.x) * M - p.y, r,
+
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вверх
m = M - p.x,
+
    {
s_2 = (m + 1) / 2 * M;
+
        if(Board[a-i][b-i])
switch (t)
+
            return false;
{
+
    }
case peshka:
+
 
case kon:
+
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вниз
r = s_2; break;
+
    {
case king:
+
        if(Board[a+i][b+i])
r = s_2 / 2; break;
+
            return false;
case ladya:
+
    }
case queen:
 
return m;
 
case slon:
 
r = m + M - 1;
 
}
 
return min(r0, r);
 
}
 
  
// Помечает клетку доски номером i
+
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вниз
void set(const point &p, type t, int i)
+
    {
{
+
        if(Board[a+i][b-i])
if (t == peshka || t == king || t == kon)
+
            return false;
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
+
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вверх
bool empty(const point &p, type t, int i)
+
    {
{
+
        if(Board[a-i][b+i])
const int n_attack[3] = {4, 8, 8};
+
            return false;
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)}};  //количество вариантов атаки для коня
+
    return true; ///если в ходе проверки слонов и угроз не обнаружилось, в данную клетку можно поставить фигуру
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 setEl(int dia, int count) ///функция расстановки слонов; line - очередная строка, count - счетчик количества фигур, которое необходимо расставить
//печатает заданное количество досок на экране
 
void print(point **figures, int n_desks, int N, type t, ostream &out = cout)
 
 
{
 
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
+
    ///dia - очередная диагональ, которую нужно исследовать на наличие фигуры и угрозы
for (int n = 0; n < n_desks; n++)
+
    int a, b; ///клетка, с которой начинается расстановка, a- очередная строка, b- очередной столбец
{
 
out << " \xdb";
 
for (int i = 0; i < M * 2 + 2; i++)
 
out << "\xdf";
 
out << "\xdb";
 
}
 
out << endl;
 
  
int *K = new int[n_desks];
+
    if (dia < M) ///условие, что клеткa данной диагонали лежат на доске
fill(K, K + n_desks, 0);
+
    {
for (int i = 0; i < M; i++)
+
        a = dia; ///начало отсчёта диагоналей, цикл движется по строке
{
+
        b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
for (int n = 0; n < n_desks; n++)
+
    }
{
+
  else ///если клеткa данной диагонали выходит за размер доски (когда цикл по строке доберется до конца
int &k = K[n];
+
    {
out << " \xdb ";
+
        a = M-1; ///самая последняя диагональ
for (int j = 0; j < M; j++)
+
        b =(dia % M)+1; ///соответственно расчёт переменной для столбца этой диагонали
{
+
    }
SetConsoleTextAttribute(hConsole, (i + j) % 2 == 0 ? 0xf0 : 0xf);
+
 
if (k < N && i == figures[n][k].x && j == figures[n][k].y)
+
    for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам снизу слева вправо вверх
{
+
    {
out << ' ' << symbols[t];
+
        int line = a-i; ///строковая координата данной клетки диагонали
k++;
+
        int column = b+i; ///столбцовая координата данной клетки диагонали
}
 
else
 
out << "  ";
 
}
 
SetConsoleTextAttribute(hConsole, 0x70);
 
out << " \xdb";
 
}
 
out << endl;
 
}
 
delete[] K;
 
  
for (int n = 0; n < n_desks; n++)
+
        if(tryEl(line, column))/// проверка на единственность слона по диагоналям
{
+
        {
out << " \xdb";
+
            Board[line][column]=1; ///установка слона в первую клетку, присваивание ей значения 1 (true)
for (int i = 0; i < M * 2 + 2; i++)
+
 
out << "\xdc";
+
            for(int i = dia + 1; i<2*M-1; ++i) ///расстановка указанного пользователем количества фигур
out << "\xdb";
+
                setEl(i,count+1);
}
+
 
out << endl << endl;
+
            if(count+1 == N) /// если нужное количество фигур поставлено, то
 +
                showBoard("E"); /// вызов функции вывода шахматной доски на экран
 +
 
 +
            Board[line][column]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
        }
 +
    }
 
}
 
}
  
// Вывести все возможные расположения на доске N фигур
+
///Функции проверки и установки для коня
void all_placements(int N, type t)
+
 
 +
bool tryHorse(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
 
{
 
{
desk = NULL;
+
    ///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 5х5 вокруг установленной фигуры
colons = rows = diag_1 = diag_2 = NULL;
+
 
// создание необходимых массивов, отмечающих занятость клеток, в зависимости от вида фигуры
+
    if ((a-1) >=0 && (b-2)>=0 && Board[a-1][b-2])
if (t == peshka || t == king || t == kon)
+
        return false;
{
+
 
desk = new int*[M];
+
    if ((a-1)>=0 && (b+2) < M && Board[a-1][b+2])
for (int j = 0; j < M; j++)
+
        return false;
desk[j] = new_array(M);
+
 
}
+
    if ((a+1) < M && (b-2) >=0 && Board[a+1][b-2])
else
+
        return false;
{
+
 
if (t == ladya || t == queen)
+
    if ((a+1) < M && (b+2) < M && Board[a+1][b+2])
{
+
        return false;
colons = new_array(M);
+
 
rows = new_array(M);
+
    if ((a-2) >=0 && (b-1) >=0 && Board[a-2][b-1])
}
+
        return false;
if (t == slon || t == queen)
+
 
{
+
    if ((a-2) >=0 && (b+1) < M && Board[a-2][b+1])
diag_1 = new_array(2*M-1);
+
        return false;
diag_2 = new_array(2*M-1);
+
 
}
+
    if ((a+2) < M && (b-1) >= 0 && Board[a+2][b-1])
}
+
        return false;
+
 
const int W = 80 / (2 * M + 5);//количество досок,помещающихся на экране
+
    if ((a+2) < M && (b+1) < M && Board[a+2][b+1])
point **figures = new point*[W];//массив фигур
+
        return false;
for (int j = 0; j < W; j++)
+
 
figures[j] = new point[N];
+
    return true; ///если в ходе проверки коней и угроз не обнаружилось, в данную клетку можно поставить фигуру
 +
}
  
int i = 0, // номер фигуры
+
void setHorse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
k = 0; //номер комбинации
+
{
while (true)
+
    if(count==N) /// если нужное количество фигур поставлено, то
{
+
    {
if (rest(figures[k%W][i], t) < N - i) // если оставшиеся фигуры не помещаются на доске
+
        showBoard("H"); /// вызов функции вывода шахматной доски на экран
{
+
    }
if (i == 0) // если все комбинации закончились
+
 
{
+
    if (a == M) ///условие необходимо; прогоняет алгоритм по всем строкам
// вывод оставшихся досок
+
        return;
if (k % W)
 
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 j=b; j<M; ++j) ///установка коней в первой строке
for (int j = 0; j < W; j++)
+
    {
delete[] figures[j];
+
        if(tryHorse(a, j)) ///проверка данной клетки на возможность установки фигуры
delete[] figures;
+
        {
if (desk)
+
            Board[a][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
{
+
            int line = a, b = j+1; ///смещение в строке на одну позицию вправо, переобозначение строки на line
for (int j = 0; j < M; j++)
+
 
delete[] desk[j];
+
            if (b == M) ///если данный столбец - самый крайний
delete[] desk;
+
            {
}
+
                b = 0; ///обнуление переменной, чтобы использовать ее при заполнении следующей строки
if (colons)
+
                line++;     ///то переход на следующую строку и дальнейшее ее заполнение
{
+
            }
delete[] colons;
+
            setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
delete[] rows;
+
            Board[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
}
+
        }
if (diag_1)
+
    }
{
 
delete[] diag_1;
 
delete[] diag_2;
 
}
 
}
 
  
 +
    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; ///смещение в строке на одну позицию вправо
  
int main()
+
                if (b == M) ///если данный столбец - самый крайний
{
+
                {
system("color 70"); // Установка серого фона и чёрного текста
+
                    b = 0;
while (true)
+
                    line++; ///то переход на следующую строку и дальнейшее ее заполнение
{
+
                }
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";
+
                setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
char c;
+
                Board[i][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
cin >> c;
+
            }
cin.ignore(100, '\n');
+
        }
switch (c)
+
    }
{
+
}
case '1':
+
 
case '2':
+
///для короля
cout << "Enter the desk size please. (The number must be even and not more than 37.)\n";
+
 
cin >> M;
+
bool tryKing(int a, int b) /// проверка на возможность поставить фигуру в квадрате 3х3, a- очередная строка, b- очередной столбец
while (!cin || M % 2 != 0 || M > 37 || M <= 0)
+
{
{
+
///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 3х3 вокруг установленной фигуры
cout << "Error: wrong desk size. Try again please.\n";
+
 
cin.clear();
+
    for(int i = a-1; i <= a+1; ++i) ///проверка по строкам
cin.ignore(100, '\n');
+
    {
cin >> M;
+
        for(int j = b-1; j <= b+1; ++j) ///проверка по столбцам
}
+
        {
cin.ignore(100, '\n');
+
            if (a>=0 && a < M && b>=0 && b < M && Board[a][b]) ///условие наличия клетки в пределах доски
cout << "Choose a figure, please.\n p - peshka, k - kon, l - ladya, s - slon, Q - Queen, K - King\n";
+
                return false;
char f;
+
 
cin >> f;
+
            if ((a+1) < M && (b-1) >=0 && Board[a+1][b-1])
cin.ignore(100, '\n');
+
                return false;
type t;
+
 
int i;
+
            if ((a+1) < M && Board[a+1][b])
do
+
                return false;
{
+
 
for (i = 0; i < 6; i++)
+
            if ((a+1) < M && (b+1) < M && Board[a+1][b+1])
{
+
                return false;
if (symbols[i] == f)
+
 
{
+
            if ((b+1) < M && Board[a][b+1])
t = type(i);
+
                return false;
break;
+
 
}
+
            if ((a-1)>=0 && (b+1) < M && Board[a-1][b+1])
}
+
                return false;
if (i == 6)
+
 
{
+
            if ((a-1) >=0 && Board[a-1][b])
cout << "Enter the right letter, you've chosen the wrong one.\n";
+
                return false;
cin >> f;
+
 
cin.ignore(100, '\n');
+
            if ((a-1) >=0 && (b-1)>=0 && Board[a-1][b-1])
}
+
                return false;
} while (i == 6);
+
 
if (c == '1')
+
            if ((b-1) >= 0 && Board[a][b-1])
{
+
                return false;
cout << "Enter the number of figures please.\n";
+
        }
int N;
+
    }
cin >> N;
+
 
while (!cin || N <= 0)
+
    return true; ///если в ходе проверки королей и угроз не обнаружилось, в данную клетку можно поставить фигуру
{
 
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>
 
  
'''[[Лосева Татьяна]]'''
+
void setKing (int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count -  счетчик количества фигур, которое необходимо расставить
 
+
{
'''Краткое описание алгоритма :'''
+
    for (int j=b; j<M; ++j)  ///установка королей в первой строке
Доска представлена в виде динамического массива;Для каждой фигуры написана отдельная функция проверки на возможность установки фигуры,проверяющая, находится ли эта фигура под ударом других.
+
    {
После выбора типа фигуры,используется рекурсивная функция,которая проверяет возможные  расстановки через данную функцию проверки ,для данного типа фигуры.
+
        if(tryKing(a, j)) ///проверка данной клетки на возможность установки фигуры
Для поиска максимального значения мы проверяем расстановку начиная с 0 количество фигур ,каждый раз увеличивая на 1,если количество расстановок станет равно нулю,то предыдущее количество фигур было максимальным.
+
        {
 +
            Board[a][j]=1; ///проверка данной клетки на возможность установки фигуры
 +
            setKing(count+1,a,j); ///расстановка фигур в первой строке
 +
            Board[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
        }
 +
    }
  
'''Инструкция''' : Пользователя попросят ввести размер доски,затем выбрать один из вариантов работы программы:1.поиск возможных расстановок для M фигур или 2.поиск максимального количества расстановок для данного поля,затем попросят выбрать тип фигуры и в первом случае количество фигур.При выводе на экран выводится номер расстановки и доска,на доске F- обозначены занятые клетки,0-пуская клетка.
+
    for(int i=a+1; i<M; ++i) ///установка фигур в оставшуюся часть шахматной доски по строкам
Для 2 пункта выводится лишь число: максимальное количество фигур,которое можно расставить.
+
    {
 +
        for (int j=0; j<M; ++j)
 +
        {
 +
            if(tryKing(i, j)) ///проверка данной клетки на возможность установки фигуры
 +
            {
 +
                Board[i][j]=1; ///проверка данной клетки на возможность установки фигуры
 +
                setKing(count+1,i,j); ///расстановка фигур
 +
                Board[i][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
 +
            }
 +
        }
 +
    }
  
Скачать можно : [http://tm.spbstu.ru/Файл:Шахматы_Лосева.rar тут]
+
    if(count==N) /// если нужное количество фигур поставлено, то
 +
    {
 +
        showBoard("K");/// вызов функции вывода шахматной доски на экран
 +
        return;
 +
    }
 +
}
  
 +
int main()
 +
{
 +
    char s; ///переменная, будет использована в цикле
 +
    do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
 +
    {
 +
        do ///цикл для считывания введенного пользователем размера доски
 +
        {
 +
            cout << "Input the size of the board: " << endl; ///ввод размера доски
 +
            cin >> M;
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
            if ( (M%2) == 1) ///цикл, работающий только в том случае, если пользователь введет нечетное число
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
            {
#include<iostream>
+
                cout << '\n' << "The number must be even, so try to input the size again" << '\n' << endl;
using namespace std;
+
            }
int N;//размер доски NxN
+
 
int **a;
+
        }
int *ax;
+
        while (M%2 !=0); ///пока пользователь не введет допуcтимое число, цикл не прерывается
int *by;
 
int l = 0;//L-номер пункта в меню
 
int M;//количество фигур
 
bool isPrint = false;//переменная для вывода на экран,когда требуется,для удобства обозначим в начале false
 
  
 +
        Board = new int*[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;  ///зануление массива
  
void print()//функция вывода на экран
+
        int V; ///пользователь выбирает один из двух вариантов работы программы
{
+
        cout << '\n' << "Input your choice: 1=placing of figures, 2=for max amount of figures" << endl;
for (int i = N - 1; i >= 0; --i)
+
        cin >> V;
{
 
for (int j = 0; j < N; ++j)
 
{
 
cout << ((a[j][i]) ? "F " : "0 ");//если (a[j][i]) истина,то есть клетка занята,ставим F,в другом случае,т.е.свободна,ставим 0
 
}
 
cout << '\n';
 
}
 
cout << '\n';
 
  
}
+
        if (V==1) ///цикл, расставляющий фигуры по введенным пользователем данным
bool Lad(int x, int y)//Ладья
+
        {
{
+
            char k; ///переменная, будет использована в цикле
for (int i = 0; i < N; ++i)
+
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
{
+
            {
if (a[i][y] == 1 )//проверяем горизонталь:если клетка занята
+
                int T; ///пользователь выбирает фигуру
{
+
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
return false;//возвращаем false
+
                cin >> T;
}
 
if (a[x][i] == 1)//проверяем вертикаль : если хотя бы одна клетка занята,то
 
{
 
return false;//возврашаем false
 
}
 
}
 
return true;//ничего выше не выполняется,значит возвращаем правду:вертикаль и горизонталь свободна
 
  
}
+
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
 +
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
 +
                {
 +
                    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;
 +
                }
  
bool Kon(int x, int y)//Коняша
+
                do ///цикл, считывающий количество фигур, заданное пользователем
{
+
                {
int i[8] = {-2, -2, -1, -1, 1, 1, 2, 2};//координаты клеток,на которые может ходить конь,относительно текущей (8 вариантов)
+
                    cout << "Input the amount of figures, it must be less than max amount or equals that" << endl;
int j[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
+
                    cin >> N;
+
                }
for (int k = 0; k < 8; k++)//8 вариантов хода
+
                while (N>maximum);   ///пока пользователь не введет допуcтимое число, цикл не прерывается
 
{
 
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;////ничего выше не выполняется,значит возвращаем правду:все варианты ходов  свободны и конь никого не перебивает,тогда можно занять клетку
 
  
}
+
                cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
  
 +
                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;
 +
                cin >> k;
 +
            }
 +
            while (k != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
 +
        }
  
 +
        else if (V==2) ///цикл, вычисляющий максимальное количество фигур по введенным пользователем данным
 +
        {
 +
            char z; ///переменная, будет использована в цикле
 +
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
 +
            {
 +
                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);
 +
                    }
  
bool Korol(int x, int y)//Король
+
                }
{
+
                if (T==2) ///максимальное количество фигур на заданной доске для короля
 
+
                {
int i[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };//координаты клеток,на которые может ходить король,относительно текущей
+
                    maximum=0.25*M*M; ///формула расчёта максимального количества фигур для заданной доски
    int j[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
+
                    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;
for(int k = 0; k < 8; k++)//8 вариантов хода
+
                    cin >> d;
{
+
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//прроверяем не выходит ли фигура за границы массива
+
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
{
+
                    {
if (a[x + i[k]][y + j[k]] != 0)//если какой нибудь из вариантов хода занят
+
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
{
+
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
return false;//то false
+
                        setKing(0,0,0);
}
+
                    }
}
+
                }
}
+
                if (T==3) ///максимальное количество фигур на заданной доске для коня
return true;//свободно,можно занимать
+
                {
}
+
                    maximum=0.5*M*M; ///формула расчёта максимального количества фигур для заданной доски
 
+
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
bool Slon(int x, int y)
+
                    cout << "If you want to see all locations of max amount, input +, if not, input -" << endl;
{
+
                    cin >> d;
int p1 = y - x;//номер диагонали слева направо
+
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
int p2 = y + x;//номер диагонали с права налево
+
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
for (int i = 0; i < N; i++)//проверяем левую диагональ
+
                    {
{
+
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
if (i + p1 >= 0 && i + p1 < N)//проверка на выход за границы массива
+
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
{
+
                        setHorse(0,0,0);
if (a[i][i + p1] == 1) //проверяем диагональ
+
                    }
{
+
                }
return false;//диагональ занята
+
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
}
+
                {
}
+
                    maximum=M; ///формула расчёта максимального количества фигур для заданной доски
if (-i + p2 >= 0 && -i + p2 < N)//вторая диагональ
+
                    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;
if (a[i][-i + p2] == 1)  
+
                    cin >> d;
{
+
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
return false;//вторая диагональ занята
+
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
}
+
                    {
}
+
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
}
+
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
return true;//обе диагонали свободны,ура!
+
                        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);
 +
                    }
 +
                }
  
bool Check(int x, int y)//Ферзь=Ладья+Слон
+
                cout << '\n' << "If you want continue counting, input +, if not, input -" << '\n' << endl;
{
+
                cin >> z;
int p1 = y - x;//диагональ 1
+
            }
int p2 = y + x;//диагональ 2
+
            while (z != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
for (int i = 0; i < N; ++i)
+
        }
{
+
        cout << '\n' << "If you want to change the size of board, input +, if not, input -" << endl;
if (a[i][y] == 1 )//проверяем горизонталь
+
        cin >> s;
{
+
        if (s=='-')
return false;//занято
+
        {
}
+
            cout << '\n' << "The program is finished." << '\n' << endl; ///вывод на экран сообщения о завершении работы программы
if (a[x][i] == 1)//проверяем вертикаль
+
        }
{
+
    }
return false;//занято
+
    while (s != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение, а также на завершение всей программы
}
 
 
if (i + p1 >= 0 && i + p1 < N)//выход за границы массива
 
{
 
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()
+
</syntaxhighlight>
{
+
</div>
cout << "Type of figure:" << endl << "1 - Ferz" << endl << "2 - Ladya" << endl << "3 - Slon" << endl << "4 - Kon" << endl << "5 - Korol" << endl;
 
cin >> l;
 
return l;
 
}
 
  
int num = 0;//номер расстановки
 
//пробует найти результаты решений.
 
  
void Func(int d,int K) //d-глубина рекурсии;K-сколько фигур нужно расставить
 
{
 
if (d == K)//когда расставили нужное количество
 
{
 
if (isPrint)//если true,то печатаем(в случае с MAX количеством доску печатать не нужно)
 
{
 
cout << "Result: " << num + 1 << '\n';//выводим нормер расстановки
 
print();//печатаем доску
 
}
 
num++;//номер расстановки увеличивается
 
return;
 
}
 
  
int minX = d != 0 ? ax[d - 1] : 0;//исходя из того куда быда поставлена предыдущая фигура
 
//,накладываются ограничения для выбора места новой,чтобы избежать поторений
 
int minY = d != 0 ? by[d - 1] + 1 : 0;
 
  
  
bool isPossible = false;//Проверяет,возможно ли занять клетку
 
for (int i = minX; i < N; ++i)
 
{
 
  
for (int j = (i != minX) ? 0 : minY; j < N; ++j)
+
'''[[Александр Сюрис]]'''
{
+
 
switch (l)//l- номер пункта в меню с фигурами
+
Программа работает в двух режимах: поиск максимального числа фигур для заданного поля и количество возможных расстановок заданного числа фигур для заданного поля.
{
+
 
case 1://ферзь
+
'''Алгоритм:''' 
isPossible = Check(i, j);
+
 
break;
+
#Для поиска количества возможных расстановок заданного числа фигур для заданного поля – Проверяется, возможно ли поставить фигуру в данную клетку, рекурсивно перебирает для каждой клетки поля, как начальной клетки, все варианты расстановки заданного количества  фигур относительно нее и выводит на экран все расстановки, которые подходят условиям.
case 2://Ладья
+
#Для поиска максимального числа фигур для заданного поля –  Проверяется, можно ли поставить одну фигуру, две, три и так далее, пока фигур больше поставить будет нельзя.
isPossible = Lad(i, j);
+
 
break;
+
Скачать можно  [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  тут].
case 3://Слон
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
isPossible = Slon(i, j);
+
#include <vector>
break;
+
#include <iostream>
case 4://Конь
+
#include <algorithm>
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;
 
}
 
  
int main()
+
using namespace std;
{
 
  
cout << "Enter size: ";//нужно ввести размер доски
+
int n,k, o, m, l, g, maxi, a, sum=0,y, mozno=1;//mozno=1 если можно поставить n фигур
cin >> N;//считываем размер доски
+
vector<vector<int> > matrix;// двухмерный вектор
  
a = new int*[N];//создаём двумерный массив,т.е.нашу доску
+
bool ladia(int x, int y) {      //проверка, можно ли в эту клетку поставить ладью
for (int i = 0; i < N; i++)
+
    for(int i = 0; i<n; i++)
{
+
        if(matrix[x][i] == 1)
a[i] = new int[N];
+
            return false;
for (int j = 0; j < N; j++)
+
    for(int j=0; j<n; j++)
a[i][j] = 0;//заполняем нулями
+
        if(matrix[j][y]==1)
}
+
            return false;
+
    return true;
ax = new int[N];//массивы для сохранения координаты каждой фигуры,чтобы избежать повторений
+
}
by = new int[N];
 
  
int d;//пункт в меню
+
bool slon(int x, int y) {  //   --//-- слона
cout<<"1 - Rasstanovka figur"<<endl<<"2 - MAX znachenie"<<endl;//два варианта работы программы
 
cin>>d;//считываем выбор пользователя
 
if(d==1)//если выбирает расстановку
 
{   
 
menu1();//то спрашиваем для какой фигуры
 
cout<<"How many figures?"<<endl;//и как много будет фигур
 
    cin>>M;//считываем количество фигур
 
isPrint = true;//в этом случае будем выводить на экран
 
Func(0,M);//запуск рекурсивной функции
 
}
 
  
if (d == 2)//случай подсчёта максимального значения
+
  for (int i=x, j=y;i<n && j>=0; i++, j--)
{
+
      if(matrix[i][j] == 1)
int n = 0;//изачально max=0
+
            return false;
menu1();//выбираем фигуру
+
  for (int i=x, j=y;i>=0 && j>=0; i--, j--)
+
      if(matrix[i][j] == 1)
do//начало цикла
+
            return false;
{
+
  for (int i=x, j=y;i>=0 && j<n; i--, j++)
num = 0;
+
      if(matrix[i][j] == 1)
Func(0, ++n);//запускаем каждый раз увеличивая значение фигур и считаем количество расстановок
+
            return false;
} while (num != 0);//количество вариантов не должно быть равно нулю
+
  for (int i=x, j=y;i<n && j<n; i++, j++)
cout <<"MAX ="<< n - 1 << endl;//если количество вариантов = 0,то выходим из цикла и предыдущее значение  максимальное
+
      if(matrix[i][j] == 1)
}
+
            return false;
 
  
int z;
+
    return true;
cin >> z;
 
  
return 0;
 
 
}
 
}
</syntaxhighlight>
 
</div>
 
  
'''[[Сергей Ляжков]]'''
+
bool fruz(int x, int y){      //    --//-- ферзя
Инструкция:
+
    if(slon(x,y) && ladia(x,y))
Вводите необходимые данные(кол-во строк, столбцов, фигуры, тип расстановки) согласно последовательности выполнения программы
+
        return true;
Краткое описание алгоритма:
 
1)Выделяет память под доску(динамическая матрица)
 
2)Устанавливает каждую следующую фигуру на n-е свободное место которое он нашел после последней установленной фигуры, где n изменяется от 1 до бесконечности(установка заканчивается тогда, когда программа не может установить очередную фигуру).
 
3)Счетчик количества фигур, которые необходимо установить, уменьшается на 1 после каждой установки.
 
4)После того, как фигура установлена, программа рекурсивно вызывает функцию установки очередной фигуры(возвращается в пункт 2)
 
5)В рекурсивную функцию отправляется только копия доски. Таким образом, возвращаясь из рекурсии, мы получаем доску без последующих установленных фигур. Когда счетчик фигур, которые необходимо установить, уменьшается до нуля, данное поле сохраняется в списке.
 
6)Вывод списка.
 
Скачать можно [http://tm.spbstu.ru/File:Шахматы.zip тут]
 
  
<br>'''[[Нарядчиков Александр]]'''<br>
+
    return false;
'''Инструкция:''' Запустить программу, следовать указаниям, полученным в меню программы.<br>
 
'''Описание программы:''' Шахматное поле представлено в виде двумерного массив 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
 
*/
 
  
#include "CHESS.h"
 
  
/* Main function */
+
}
int main( void )
 
{
 
// Переменная, отвечающая за выход из меню
 
int IsReady = 1;
 
// Количество строк поля; количество столбцов поля
 
int N, M;
 
// Если идет поиск всех расстановок - 0; если идет поиск максимального числа фигур на доске - 1
 
int IsCount;
 
// Количество фигур на поле
 
int Number;
 
// Тип фигуры; количество разных расстановок; максимальное число фигур на доске
 
int tmp, count, max_value = 1;
 
// Создание указателя на тип FILE
 
FILE *F;
 
  
// Консольное меню
+
bool kon(int x, int y) {   // --//-- коня
while (IsReady == 1)
 
{
 
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";
+
  if (x-1>=0 && y-2>=0 && matrix[x-1][y-2]==1)
cin >> N;
+
        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;
 +
}
  
cout << "Input number of columns on the field:\n";
+
bool king(int x, int y) {  // --//--  короля
cin >> M;
 
  
// Поле шахмат
+
    if (x-1>=0 && y-1>=0 && matrix[x-1][y-1]==1)
chess desk(N, M);
+
        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;
  
// Обнуление поля
+
}
desk.Clear();
 
  
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 mass() {  // вывод доски на экран
cin >> IsCount;
+
 
 +
for(int i = 0; i<n; i++)
 +
  {
  
// Если идет поиск всех расстановок
+
    for(int j = 0; j<n; j++)
if (IsCount == 0)
+
        cout<<matrix[i][j]<<" ";
{
 
cout << "Input number of chessmen on the field:\n";
 
cin >> Number;
 
  
// Создание файла и его открытие
+
        cout<<endl;
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);
 
  
// Количество разных расстановок
+
}
count = desk.FillField(IsCount, (type)(tmp + 1), 0, 0, Number, 0);
 
  
// Открытие файла в режиме повторной записи
+
int del() // очистка доски(все нули)
fopen_s(&F, "chess.txt", "at");
 
fprintf(F, "\nNumber of fields: %i", count);
 
// Закрытие файла
 
fclose(F);
 
  
cout << "Done!\nCheck 'chess.txt' to see results\n";
+
for (int i=0; i<n; i++) {
}
 
  
// Если идет поиск максимального числа фигур на доске
+
    for (int j=0; j<n; j++)
else if (IsCount == 1)
+
        matrix[i][j]=0;
{
+
}
while (desk.FillField(IsCount, (type)(tmp + 1), 0, 0, max_value, 0))
 
max_value++;
 
cout << "The maximum number of chessmen on the board is " << (max_value - 1) << endl;
 
max_value = 1;
 
}
 
  
// Если было введено некорректное значение для IsCount
+
}
else
 
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)
 
continue;
 
else
 
exit(0);
 
}
 
  
return 0;
+
void vsevarintyrasstavitnfigur(int x,int y){  // рекурсивный поиск всех вараинтов расстановок заданнного количества фигур (x - номер фигуры в доске, если ее растянуть в линию, y - кол-во фигур)
} // End of 'main' function
+
    if(y==0) {
 +
        if (a==1){
 +
            mass();
 +
            cout<<'\n';
 +
        }
 +
        if(a==2) {
 +
                mozno = 1;  //mozno=1 если можно поставить n фигур
  
// END OF 'T04CHESS.CPP' FILE
+
        }
</syntaxhighlight>
 
"'''CHESS.CPP'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: CHESS.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "CHESS.H"
+
        return;
 +
    }
  
// Количество расстановок
+
    for(int i=x;i<n*n;i++){
int Result_count = 0;
 
  
/* Clear field function */
+
        if (o==1)
// Обнуление поля
+
        if(fruz(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
void chess::Clear( void )
+
 
{
+
        if (o==2)
// Все клетки свободны
+
        if(ladia(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
for (int i = 0; i < N; i++)
 
for (int j = 0; j < M; j++)
 
Field[i][j] = Free;
 
} // End of 'Clear' function
 
  
/* Check if the cell is available that function */
+
        if (o==3)
// Проверка, свободна и существует ли данная клетка
+
        if(slon(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
int chess::IsAvailable( int x, int y )
 
{
 
if (x >= 0 && y >= 0 && x < M && y < N)
 
if (Field[y][x] == Free)
 
  return 1;
 
 
return 0;
 
} // End of 'IsAvailable' function
 
  
/* Output field in file function */
+
        if (o==4)
// Запись одного поля в файл
+
        if(kon(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
void chess::OutputInFile( void )
 
{
 
// Создание указателя на тип FILE
 
FILE *F;
 
  
// Открытие файла в режиме повторной записи
+
        if (o==5)
fopen_s(&F, "chess.txt", "at");
+
        if(king(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
  
// Переход на следующую строку файла
 
fputc('\n', F);
 
  
// Заполнение файла текущем полем
+
        vsevarintyrasstavitnfigur(i+1, y);
for (int i = 0; i < N; ++i)
+
        matrix[i/n][i%n]=0;//удаление фигуры из прошлой клетки для проверки других вариантов
{
+
        y++;
// '*' - свободная клетка; '#' - клетка, которая уже занята
 
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 */
+
void maxfig(){  //поиск максимального количества фигур
// Заполнение полей и поиск максимального числа расстановок
+
    int i=0;
// Chessmen_num - количество фигур, которое нужно поставить; Already_stood - количество, которое уже стоит
+
while(mozno==1){ //проверяет для данной доски возможность расставить 1,2... фигуры, пока не доходит до количества, которое расставить невозхможно. Тогда это количество фигур -1 - искомая величина
int chess::FillField( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood )
+
        i++;
{
+
        mozno=0;
int i, j, k, l;
+
        vsevarintyrasstavitnfigur(0,i);
chess desk2(N, M);
+
    }
 +
    setlocale(LC_ALL, "Russian");
 +
    cout<<"Максимальное количество фигур = "<<i-1<<endl;
 +
}
 +
 
 +
 
 +
int main() {
 +
setlocale(LC_ALL, "Russian");
 +
    g=0;
 +
    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;
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
    if (o==1)  {
 +
                cout<<"Ферзь"<<endl;
 +
 
 +
            if(a==1)
 +
                {
 +
                    cin>>y;
 +
                    vsevarintyrasstavitnfigur(0,y);
 +
                }
 +
 
 +
 
 +
            if (a==2)
 +
                maxfig();
 +
 
 +
                }
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
    if (o==2)  {
 +
                cout<<endl<<"Ладья"<<endl;
 +
 
 +
                    if(a==1)
 +
                    {
 +
 
 +
                        cin>>y;
 +
                        vsevarintyrasstavitnfigur(0,y);
 +
                    }
 +
 
 +
                    if (a==2)
 +
                        maxfig();
 +
 
 +
                }
 +
 
 +
 
 +
    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();
 +
 
 +
                }
 +
 
 +
            }
 +
 
 +
 
 +
 
 +
}
  
// Обнуление поля
 
desk2.Clear();
 
  
// Пробег по всем оставшимся клеткам поля, начиная с той, на которой мы закончили предыдущую итерацию
 
for (i = y; i < N; i++)
 
for (j = ((i == y) ? x : 0); j < M; j++)
 
{
 
// Если клетка свободна
 
if (Field[i][j] == Free)
 
{
 
// Копируем доску
 
Copy(desk2);
 
 
// Множественный выбор типа фигуры
 
switch (set)
 
{
 
// Ладья
 
case castle:
 
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;
 
}
 
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>
 
</syntaxhighlight>
"'''CHESS.H'''"
+
</div>
<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
+
Доска представлена в виде динамического массива;Для каждой фигуры написана отдельная функция проверки на возможность установки фигуры,проверяющая, находится ли эта фигура под ударом других.
 +
После выбора типа фигуры,используется  рекурсивная функция,которая проверяет возможные  расстановки через данную функцию проверки ,для данного типа фигуры.
 +
Для поиска максимального значения мы проверяем расстановку начиная с 0 количество фигур ,каждый раз увеличивая на 1,если количество расстановок станет равно нулю,то предыдущее количество фигур было максимальным.
 +
 
 +
'''Инструкция''' : Пользователя попросят ввести размер доски,затем выбрать один из вариантов работы программы:1.поиск возможных расстановок для M фигур или 2.поиск максимального количества расстановок для данного поля,затем попросят выбрать тип фигуры и в первом случае количество фигур.При выводе на экран выводится номер расстановки и доска,на доске F- обозначены занятые клетки,0-пуская клетка.
 +
Для 2 пункта выводится лишь число: максимальное количество фигур,которое можно расставить.
 +
 
 +
Скачать можно : [http://tm.spbstu.ru/Файл:Шахматы_Лосева.rar тут]
 +
 
 +
 
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include<iostream>
 +
using namespace std;
 +
int N;//размер доски NxN
 +
int **a;
 +
int *ax;
 +
int *by;
 +
int l = 0;//L-номер пункта в меню
 +
int M;//количество фигур
 +
bool isPrint = false;//переменная для вывода на экран,когда требуется,для удобства обозначим в начале false
 +
 
 +
 
 +
void print()//функция вывода на экран
 
{
 
{
private:
+
for (int i = N - 1; i >= 0; --i)
// Поле данных фигур
 
type **Field;
 
// Количество строк поля; количество столбцов поля
 
int N, M;
 
public:
 
/* Default constructor */
 
chess( void )
 
 
{
 
{
N = 8, M = 8;
+
for (int j = 0; j < N; ++j)
+
{
// Выделение памяти под массив поля
+
cout << ((a[j][i]) ? "F " : "0 ");//если (a[j][i]) истина,то есть клетка занята,ставим F,в другом случае,т.е.свободна,ставим 0
Field = new type*[N];
+
}
for (int i = 0; i < N; i++)
+
cout << '\n';
Field[i] = new type[M];
 
 
}
 
}
+
cout << '\n';
/* Class constructor */
+
 
chess( int _N, int _M ) : N(_N), M(_M)
+
}
 +
bool Lad(int x, int y)//Ладья
 +
{
 +
for (int i = 0; i < N; ++i)
 
{
 
{
// Выделение памяти под массив поля
+
if (a[i][y] == 1 )//проверяем горизонталь:если клетка занята
Field = new type* [N];
+
{
for (int i = 0; i < N; i++)
+
return false;//возвращаем false
Field[i] = new type [M];
+
}
 +
if (a[x][i] == 1)//проверяем вертикаль : если хотя бы одна клетка занята,то
 +
{
 +
return false;//возврашаем false
 +
}
 
}
 
}
 +
return true;//ничего выше не выполняется,значит возвращаем правду:вертикаль и горизонталь свободна
  
/* Class destructor */
+
}
~chess( void )
 
{
 
// Чистка памяти
 
for (int i = 0; i < N; i++)
 
delete[] Field[i];
 
delete[] Field;
 
}
 
  
/* Clear field function */
+
bool Kon(int x, int y)//Коняша
void Clear( void );
+
{
 +
int i[8] = {-2, -2, -1, -1, 1, 1, 2, 2};//координаты клеток,на которые может ходить конь,относительно текущей (8 вариантов)
 +
int j[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
 
 
/* Check if the cell is available that function */
+
for (int k = 0; k < 8; k++)//8 вариантов хода
int IsAvailable( int x, int y );
 
 
/* Output field in file function */
 
void OutputInFile( void );
 
 
 
/* Copy desks function */
+
{
void Copy( chess& desk2 );
+
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//проверка выхода за границы массива
+
{
/* Fill field function */
+
if (a[x + i[k]][y + j[k]] != 0)//клетка занята
int FillField ( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood);
+
{
}; // end of 'chess' class
+
return false;//возвращем false
 +
}
 +
}
 +
}
 +
return true;////ничего выше не выполняется,значит возвращаем правду:все варианты ходов  свободны и конь никого не перебивает,тогда можно занять клетку
  
#endif /*__CHESS_H_ */
+
}
  
// END OF 'CHESS.H' FILE
 
</syntaxhighlight>
 
</div>
 
[http://tm.spbstu.ru/File:T04CHESS.7z Скачать архив]
 
<br>
 
  
  
'''[[Рубинова Раиса]]'''
 
  
'''Основная идея программы''': программа позволяет выводить на экран всевозможные расстановки n однотипных фигур на шахматной доске размером n*n так, чтобы ни одна из фигур не била другую.
+
bool Korol(int x, int y)//Король
 +
{
  
Скачать можно [http://tm.spbstu.ru/File:nmk.rar тут.]
+
int i[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };//координаты клеток,на которые может ходить король,относительно текущей
 +
    int j[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
for(int k = 0; k < 8; k++)//8 вариантов хода
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
{
#include <iostream>
+
if (x + i[k] >= 0 && x + i[k] < N && y + j[k] >= 0 && y + j[k] < N)//прроверяем не выходит ли фигура за границы массива
#include <cstring>
+
{
#include <cstdlib>
+
if (a[x + i[k]][y + j[k]] != 0)//если какой нибудь из вариантов хода занят
#include <ctime>
+
{
 +
return false;//то false
 +
}
 +
}
 +
}
 +
return true;//свободно,можно занимать
 +
}
  
using namespace std;
+
bool Slon(int x, int y)
int R = 0; ///переменная, отвечающая за количество вариантов расстановок
+
{
int N; ///количество фигур для расстановки, которое задает пользователь
+
int p1 = y - x;//номер диагонали слева направо
int **B; ///двумерный массив, отображающий шахматную доску
+
int p2 = y + x;//номер диагонали с права налево
int M; /// размер шахматной доски
+
for (int i = 0; i < N; i++)//проверяем левую диагональ
 
+
{
 
+
if (i + p1 >= 0 && i + p1 < N)//проверка на выход за границы массива
void showBoard() ///функция, выводящая доску на экран
+
{
{
+
if (a[i][i + p1] == 1) //проверяем диагональ
    for(int i=0; i<M; ++i) /// строки
+
{
    {
+
return false;//диагональ занята
        for(int j=0; j<M; ++j) /// столбцы
+
}
            {cout << B[i][j] << " ";} ///заполнение клетки с координатами i;j
+
}
        cout << endl;
+
if (-i + p2 >= 0 && -i + p2 < N)//вторая диагональ
    }
+
{
    cout << "Variant " << ++R << "\n\n"; ///вывод номера варианта расположения с последующим переходом на новую строку
+
if (a[i][-i + p2] == 1)
    return;
+
{
 +
return false;//вторая диагональ занята
 +
}
 +
}
 +
}
 +
return true;//обе диагонали свободны,ура!
 
}
 
}
  
bool checkQueen(int a, int b) /// функция, проверяющая, не бьется ли ферзь другим ферзем
+
bool Check(int x, int y)//Ферзь=Ладья+Слон
 
{
 
{
    for (int i = 0; i < M; ++i) ///проверка строки
+
int p1 = y - x;//диагональ 1
    {
+
int p2 = y + x;//диагональ 2
        if(B[a][i])
+
for (int i = 0; i < N; ++i)
            return false;
+
{
    }
+
if (a[i][y] == 1 )//проверяем горизонталь
 
+
{
    for(int i = 0; i < M; ++i) ///проверка столбца
+
return false;//занято
    {
+
}
        if(B[i][b])
+
if (a[x][i] == 1)//проверяем вертикаль
            return false;
+
{
    }
+
return false;//занято
 
+
}
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///по диагонали влево-вверх
+
    {
+
if (i + p1 >= 0 && i + p1 < N)//выход за границы массива
        if(B[a-i][b-i])
+
{
            return false;
+
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;//свободно!
 +
}
  
    for(int i = 1; a+i < M && b+i < M; ++i)///по диагонали вправо-вниз
+
int  menu1()
    {
+
{
        if(B[a+i][b+i])
+
cout << "Type of figure:" << endl << "1 - Ferz" << endl << "2 - Ladya" << endl << "3 - Slon" << endl << "4 - Kon" << endl << "5 - Korol" << endl;
            return false;
+
cin >> l;
    }
+
return l;
 +
}
  
    for(int i = 1; a+i < M && b-i >= 0; ++i)///по диагонали влево-вниз
+
int num = 0;//номер расстановки
    {
+
//пробует найти результаты решений.
        if(B[a+i][b-i])
 
            return false;
 
    }
 
  
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///по диагонали вправо-вверх
+
void Func(int d,int K) //d-глубина рекурсии;K-сколько фигур нужно расставить
    {
 
        if(B[a-i][b+i])
 
            return false;
 
    }
 
 
 
    return true;
 
}
 
 
 
void Queen(int a, int count) ///функция, расстанавливающая ферзи
 
 
{
 
{
    for(int b = 0; b < M; ++b) /// расстановка по изменению номера столбца
+
if (d == K)//когда расставили нужное количество
    {
+
{
        if(checkQueen(a, b)) ///проверка, бьется ли данная клетка ферзем
+
if (isPrint)//если true,то печатаем(в случае с MAX количеством доску печатать не нужно)
        {
+
{
            B[a][b] = 1; ///заполнение первой клетки
+
cout << "Result: " << num + 1 << '\n';//выводим нормер расстановки
            for(int i = a+1; i < M; ++i) ///расстановка указанного пользователем количества фигур
+
print();//печатаем доску
                Queen(i,count+1);
+
}
            if(count+1==N) /// проверка, расставили ли мы нужное количество фигур
+
num++;//номер расстановки увеличивается
                showBoard();
+
return;
            B[a][b]=0; ///обнуление переменной
+
}
        }
 
    }
 
}
 
  
bool checkRook(int a, int b) /// функция, проверяющая ли данную клетку ладья
+
int minX = d != 0 ? ax[d - 1] : 0;//исходя из того куда быда поставлена предыдущая фигура
{
+
//,накладываются ограничения для выбора места новой,чтобы избежать поторений
    for (int i = 0; i < M; ++i) ///проверка строки
+
int minY = d != 0 ? by[d - 1] + 1 : 0;
    {
 
        if(B[a][i])
 
            return false;
 
    }
 
  
    for(int i = 0; i < M; ++i) ///проверка столбца
 
    {
 
        if(B[i][b])
 
            return false;
 
    }
 
  
    return true;
+
bool isPossible = false;//Проверяет,возможно ли занять клетку
}
+
for (int i = minX; i < N; ++i)
 +
{
  
void Rook(int a, int count) ///функция, расстанавливающая ладьи
+
for (int j = (i != minX) ? 0 : minY; j < N; ++j)
{
+
{
    for(int b = 0; b < M; ++b) /// расстановка по строкам с изменением номера столбца
+
switch (l)//l- номер пункта в меню с фигурами
    {
+
{
        if(checkRook(a, b)) ///проверка, бьется ли данная клетка ладьей
+
case 1://ферзь
        {
+
isPossible = Check(i, j);
            B[a][b] = 1; ///установка ладьи
+
break;
            for(int i =a+1; i<M; ++i)
+
case 2://Ладья
                Rook(i,count+1);
+
isPossible = Lad(i, j);
            if(count+1 == N) /// проверка, расставили ли мы нужное количество элементов
+
break;
                showBoard();
+
case 3://Слон
 
+
            B[a][b]=0; ///обнуление переменной
+
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;
 
}
 
}
  
bool checkElephant(int a, int b) /// функция, проверяющая, бьется ли данная клетка слоном
+
int main()
 
{
 
{
    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)///проверка по диагонали вправо-вниз
+
cout << "Enter size: ";//нужно ввести размер доски
    {
+
cin >> N;//считываем размер доски
        if(B[a+i][b+i])
 
            return false;
 
    }
 
  
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка по диагонали влево-вниз
+
a = new int*[N];//создаём двумерный массив,т.е.нашу доску
    {
+
for (int i = 0; i < N; i++)
        if(B[a+i][b-i])
+
{
            return false;
+
a[i] = new int[N];
    }
+
for (int j = 0; j < N; j++)
 
+
a[i][j] = 0;//заполняем нулями
    for(int i = 1; a-i >= 0 && b+i < M; ++i) ///проверка по диагонали вправо-вверх
+
}
    {
+
        if(B[a-i][b+i])
+
ax = new int[N];//массивы для сохранения координаты каждой фигуры,чтобы избежать повторений
            return false;
+
by = new int[N];
    }
 
  
    return true;
+
int d;//пункт в меню
}
+
cout<<"1 - Rasstanovka figur"<<endl<<"2 - MAX znachenie"<<endl;//два варианта работы программы
void Elephant(int dia, int count) ///функция, расстанавливающая слоны
+
cin>>d;//считываем выбор пользователя
{
+
if(d==1)//если выбирает расстановку
    int a, b; /// задача клетки, соответствующекй данной диагонали
+
{  
    if (dia < M) /// проверка диагонали
+
menu1();//то спрашиваем для какой фигуры
    {
+
cout<<"How many figures?"<<endl;//и как много будет фигур
        a = dia; /// номер строки - номер диагонали
+
    cin>>M;//считываем количество фигур
        b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
+
isPrint = true;//в этом случае будем выводить на экран
    }
+
Func(0,M);//запуск рекурсивной функции
  else ///если все диагонали рассмотрены
+
}
    {
 
        a = M-1; /// рассматриваем самую последнюю диагональ
 
        b =(dia % M)+1; ///рассчитываем координату столбца для данной диагонали
 
    }
 
  
    for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам из нижнего левого угла в правый верхний
+
if (d == 2)//случай подсчёта максимального значения
    {
+
{
        int line=a-i; ///координата строки (мы уменьшаем координату строки)
+
int n = 0;//изачально max=0
        int column=b+i; ///координата столбца (но увеличиваем координату столбца)
+
menu1();//выбираем фигуру
 +
 +
do//начало цикла
 +
{
 +
num = 0;
 +
Func(0, ++n);//запускаем каждый раз увеличивая значение фигур и считаем количество расстановок
 +
} while (num != 0);//количество вариантов не должно быть равно нулю
 +
cout <<"MAX ="<< n - 1 << endl;//если количество вариантов = 0,то выходим из цикла и предыдущее значение максимальное
 +
}
 +
  
        if(checkElephant(line, column))/// проверка, бьется ли слон по диагонали
+
int z;
        {
+
cin >> z;
            B[line][column]=1; ///установка слона
 
  
            for(int i=dia+1; i<2*M-1; ++i) ///расстановка фигур, основанная на изменении параметров (номера диагонали и количества рсставленных фигур)
+
return 0;
                Elephant(i,count+1);
+
}
 
+
</syntaxhighlight>
            if(count+1 == N) /// проверка количества расставленных фигур
+
</div>
                showBoard();
 
  
            B[line][column]=0; ///обнуление переменной
+
'''[[Степанянц Степан]]'''
        }
 
    }
 
}
 
  
bool checkHorse(int a, int b) /// функция, проверяющая, бьется ли данная клетка конями
+
'''Программа''': 1)Программа получает все возможные варианты расстановок одинаковых фигур на поле боя(шахматной доске) так, чтобы они не смогли бить друг друга.2)Программа выводит максимальное число фигур, которые можно поставить на шахматную доску nxn так, чтобы они не смогли бить друг друга.
{
 
    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])
+
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
        return false;
 
  
    if ((a+1) < M && (b+2) < M && B[a+1][b+2])
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
        return false;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <iostream>
 +
#include <vector>
  
    if ((a-2) >=0 && (b-1) >=0 && B[a-2][b-1])
+
using namespace std;
        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])
+
//задаю массивы в которых изображены все ходы определенных фигур
 +
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 false;
 
 
     return true;
 
     return true;
 
}
 
}
  
void Horse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
+
void print(int n, vector<vector<pair<bool, int> > > board) {
{
+
     for (int i = 0; i < n; i++) {
     if(count==N) /// проверка количества расставленных фигур
+
        for (int j = 0; j < n; j++) {
    {
+
            cout << ((board[i][j].first) ? " X " : " 0 ");
        showBoard();
+
        }
 +
        cout << '\n';
 
     }
 
     }
     if (a == M) /// не выходит ли за предел доски
+
     cout << "-------------------------------------\n";
        return;
+
}
    for (int j=b; 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) {
        if(checkHorse(a, j)) ///проверка
+
    int ans = 0;
        {
+
    if (count == k && !task) {
            B[a][j]=1; ///установка коня
+
        print(n, board);
            int l = a, b = j+1; ///смещение в другой столбец
+
        return 1;
 
 
            if (b == M) ///проверка, не крайний ли это столбец, так как тогда мы не можем продолжать расстановку (мы ее завершили)
 
            {
 
                b=0; ///обнуление переменной
 
                l++;    ///переход на следующую
 
            }
 
            Horse(count+1,l,b); ///установка фигуры, увеличение счетчика
 
            B[a][j]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
 
        }
 
 
     }
 
     }
     for(int i=a+1; i<M; ++i) ///заполнение строк
+
     else if(task) {
    {
+
         ans = max(ans, count);
         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;  ///обнуление переменной
 
            }
 
        }
 
 
     }
 
     }
}
+
     for (int i = ii + jj / n; i < n; i++) {
 
+
         for (int j = jj % n; j < n; j++) {
bool checkKing(int a, int b) /// функция, проверяющая, бьет ли данную клетку король
+
             if (!board[i][j].first && !board[i][j].second) {
{
+
                 switch (fig) {
     for(int i = a-1; i <= a+1; ++i)
+
                    case 1://конь
    {
+
                        for (int k = 0; k < 8; k++) {
         for(int j = b-1; j <= b+1; ++j)
+
                            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++;
             if (a>=0 && a < M && b>=0 && b < M && B[a][b])
+
                        }
                 return false;
+
                        break;
 
+
                    case 2://слон
            if ((a+1) < M && (b-1) >=0 && B[a+1][b-1])
+
                        for (int k = 0; k < n; k++) {
                return false;
+
                            for (int l = 0; l < 4; l++) {
 
+
                                if (ok(i + k * d_bish[l][0], j + k * d_bish[l][1], n))
            if ((a+1) < M && B[a+1][b])
+
                                    board[i + k * d_bish[l][0]][j + k * d_bish[l][1]].second++;
                return false;
+
                            }
 
+
                        }
            if ((a+1) < M && (b+1) < M && B[a+1][b+1])
+
                        break;
                return false;
+
                    case 3: // ладья
 
+
                        for (int k = 0; k < n; k++)
            if ((b+1) < M && B[a][b+1])
+
                            board[i][k].second++, board[k][j].second++;
                return false;
+
                        break;
 
+
                    case 4: // король
            if ((a-1)>=0 && (b+1) < M && B[a-1][b+1])
+
                        for (int k = 0; k < 8; k++)
                return false;
+
                            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++;
            if ((a-1) >=0 && B[a-1][b])
+
                        break;
                return false;
+
                    case 5: // ферзь
 
+
                        for (int k = 0; k < 8; k++)
            if ((a-1) >=0 && (b-1)>=0 && B[a-1][b-1])
+
                            for (int l = 0; l < n; l++)
                return false;
+
                                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++;
            if ((b-1) >= 0 && B[a][b-1])
+
                        break;
                return false;
+
                       
        }
+
                }
    }
+
                //Рекурсия
 
+
                board[i][j].first = true;
    return true;
+
                if (!task)
}
+
                    ans += func(n, k, count + 1, board, i, j + 1, fig, task);
 
+
              //обратный ход
void King (int count, int a, int b) ///функция, расставляющая коней
+
                else
{
+
                    ans = max(ans, func(n, k, count + 1, board, i, j + 1, fig, task));
    for (int j=b; j<M; ++j) ///установка королей в первой строке
+
                board[i][j].first = false;
    {
+
                switch (fig) {
        if(checkKing(a, j)) ///проверка данной клетки на возможность установки фигуры
+
                    case 1:
        {
+
                        for (int k = 0; k < 8; k++) {
            B[a][j]=1; ///если по результатам проверки можно поставить фигуру, то мы ее ставим
+
                            if (ok(i + d_knight[0][k], j + d_knight[1][k], n))
            King(count+1,a,j); ///расстановка фигур для первой доски
+
                                board[i + d_knight[0][k]][j + d_knight[1][k]].second--;
            B[a][j]=0; ///обнуление переменной
+
                        }
        }
+
                        break;
    }
+
                    case 2:
 
+
                        for (int k = 0; k < n; k++) {
    for(int i=a+1; i<M; ++i) ///расстановка фигур
+
                            for (int l = 0; l < 4; l++) {
    {
+
                                if (ok(i + k * d_bish[l][0], j + k * d_bish[l][1], n))
        for (int j=0; j<M; ++j)
+
                                    board[i + k * d_bish[l][0]][j + k * d_bish[l][1]].second--;
        {
+
                            }
            if(checkKing(i, j)) ///проверка данной клетки на возможность установки фигуры
+
                        }
            {
+
                        break;
                B[i][j]=1; /// если короля можно поставить, то ставим его в данную клетку
+
                    case 3:
                King(count+1,i,j);
+
                        for (int k = 0; k < n; k++)
                B[i][j]=0; ///обнуление переменной
+
                            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;
     if(count==N)
+
}
    {
+
//меню
         showBoard();/// вывод шахмат на экран
+
int main() {
         return;
+
    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>
 +
 +
'''[[Лобанов Илья]]'''
 +
 +
'''Описание алгоритма''':
 +
 +
Программа проверяет возможность расстановки фигур на доске M*M . При выводе на экран на экран клетки,занятые фигурами ,помечаются буквами,соответствующими первой букве типа фигуры. Также программа считает максимальное число фигур определенного типа,которые можно расставить на доске.
 +
 +
'''Инструкция''':
  
int main()
+
В окне консоли пользователю предлагается выбрать 2 типа работы программы, затем пользователь вводит размер доски(четный),тип и количество фигур,которые необходимо разместить на доске.В зависимости от режима работы программы ,будет выведено либо максимально возможное число расстановок фигур,либо максимальное число фигур.
 +
Скачать можно [[http://tm.spbstu.ru/File:ConsoleApplication54.rar тут]]
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <iostream>
 +
#include <windows.h>
 +
using namespace std;
 +
 
 +
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;
 +
 
 +
// структура для описания клектки доски
 +
struct point
 
{
 
{
        cout << "Enter the size of the board: " << endl; ///ввод размера доски
+
int x, y;
        cin >> M;
+
point(int x = 0, int y = 0): x(x), y(y) {}
        B = new int*[M];
+
point &operator++()
        for (int i=0; i<M; i++)
+
{
            B[i] = new int[M];
+
if (y == M - 1)
        for (int i = 0; i<M; i++)
+
{
            for (int j = 0; j<M; j++)
+
++x;
                B[i][j] = 0;
+
y = 0;
        int Var;
+
}
        cout << '\n' << "1=your number of figures, 2=max number of figures" << endl;
+
else
        cin >> Var;
+
++y;
        int F;
+
return *this;
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
+
}
                cin >> F;
+
point operator+(const point &p) const
        if (Var==1) /// если пользователь выбрал свое количество фигур, то мы выполняем следующие действия:
+
{
        {
+
return point(x + p.x, y + p.y);
                int mn;
+
}
                    cout << "Input the number of figures" << endl;
+
point next() const
                    cin >> N;
+
{
                if (F==1)
+
point r = *this;
                {
+
return ++r;
                    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)
+
int *new_array(int n)
                {
+
{
                    mn=0.25*M*M;
+
int *a = new int[n];
                    cout << '\n' << "Max number " << mn <<  endl;
+
fill(a, a + n, NONE);
                    N=mn; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
+
return a;
                    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);
 
                    }
 
                }
 
    }
 
  
 +
// Количество свободных клеток от клетки 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
</syntaxhighlight>
+
void set(const point &p, type t, int i)
</div>
+
{
 
+
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;
Скачать программу можно  [http://tm.spbstu.ru/:File:Шахматы0001.zip    ]
+
if (t == slon || t == queen)
 
+
diag_1[p.x+p.y] = diag_2[p.x-p.y+M-1] = i;
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
}
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
 
 
#define windows
 
 
 
#include <stdio.h>
 
#include <vector>
 
 
 
#ifdef windows
 
#include <windows.h>
 
#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
+
// Можно ли поставить фигуру номер i на клетку p
 +
bool empty(const point &p, type t, int i)
 
{
 
{
    char **deskFigures, **deskOccupy;  //desk with figures, desk with occupation counter for each cell
+
const int n_attack[3] = {4, 8, 8};
    int x, y, size, a, f;   //pointer position(x, y), size of the desk, amount of prints, amount of figures
+
const point attack[3][8] = {{point(1, 1), point(1, -1), point(-1, 1), point(-1, -1)}, //кол-во вариантов атаки для пешки
    vector<pair<int, int> > *s; //stack of placed figures
+
{point(1, 1), point(1, -1), point(-1, 1), point(-1, -1), point(1, 0), point(-1, 0), point(0, 1), point(0, -1)}, // кол-во вариантов атаки для короля
    bool stackIsUsed;  //if stack is needed
+
{point(1, 2),point(-1, 2),point(1, -2), point (-1,-2), point (2, 1), point (2,-1), point (-2, 1),point (-2,-1)}};  //количество вариантов атаки для коня
    desk(int size, bool stackIsUsed = true):x(0), y(0), size(size), a(0), f(0), stackIsUsed(stackIsUsed)
+
switch(t)
    {
+
{
        deskFigures = new char*[size];
+
case peshka:
        for(int i = 0; i < size; i++)
+
case king:
            deskFigures[i] = new char[size];
+
case kon:
        deskOccupy = new char*[size];
+
for (int k = 0; k < n_attack[t]; k++)
        for(int i = 0; i < size; i++)
+
{
            deskOccupy[i] = new char[size];
+
point q = p + attack[t][k];
        if(stackIsUsed)
+
if (q.x >= 0 && q.x < M && q.y >= 0 && q.y < M && desk[q.x][q.y] < i)
            s = new vector<pair<int, int> >;
+
return false;
        clear();
+
}
    }
+
return true;
    ~desk()
+
case ladya:
    {
+
return colons[p.y] > i && rows[p.x] > i;
        for(int i = 0; i < size; i++)
+
case slon:
            delete deskFigures[i];
+
return diag_1[p.x+p.y] > i && diag_2[p.x-p.y+M-1] > i;
        delete deskFigures;
+
case queen:
        for(int i = 0; i < size; i++)
+
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;
            delete deskOccupy[i];
+
}
        delete deskOccupy;
+
}
        if(stackIsUsed)
+
 
            delete s;
+
//печатает заданное количество досок на экране
    }
+
void print(point **figures, int n_desks, int N, type t, ostream &out = cout)
    void setKnight(int x, int y, int z) //increase all cells occupied by knight at (x, y) on z
+
{
    {
+
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        if(x + 2 < size)
+
for (int n = 0; n < n_desks; n++)
        {
+
{
            if(y - 1 >= 0)
+
out << " \xdb";
                deskOccupy[x + 2][y - 1] += z;
+
for (int i = 0; i < M * 2 + 2; i++)
            if(y + 1 < size)
+
out << "\xdf";
                deskOccupy[x + 2][y + 1] += z;
+
out << "\xdb";
        }
+
}
        if(y + 2 < size)
+
out << endl;
        {
+
 
            if(x - 1 >= 0)
+
int *K = new int[n_desks];
                deskOccupy[x - 1][y + 2] += z;
+
fill(K, K + n_desks, 0);
            if(x + 1 < size)
+
for (int i = 0; i < M; i++)
                deskOccupy[x + 1][y + 2] += z;
+
{
        }
+
for (int n = 0; n < n_desks; n++)
        if(x - 2 >= 0)
+
{
        {
+
int &k = K[n];
            if(y - 1 >= 0)
+
out << " \xdb ";
                deskOccupy[x - 2][y - 1] += z;
+
for (int j = 0; j < M; j++)
            if(y + 1 < size)
+
{
                deskOccupy[x - 2][y + 1] += z;
+
SetConsoleTextAttribute(hConsole, (i + j) % 2 == 0 ? 0xf0 : 0xf);
        }
+
if (k < N && i == figures[n][k].x && j == figures[n][k].y)
        if(y - 2 >= 0)
+
{
        {
+
out << ' ' << symbols[t];
            if(x - 1 >= 0)
+
k++;
                deskOccupy[x - 1][y - 2] += z;
+
}
            if(x + 1 < size)
+
else
                deskOccupy[x + 1][y - 2] += z;
+
out << "  ";
        }
+
}
    }
+
SetConsoleTextAttribute(hConsole, 0x70);
    void setBishop(int x, int y, int z) //increase all cells occupied by bishop at (x, y) on z
+
out << " \xdb";
    {
+
}
        for(int ix = 0, iy1 = y - x, iy2 = y + x; ix < size; ix++, iy1++, iy2--)
+
out << endl;
            if(ix != x)
+
}
            {
+
delete[] K;
                if((iy1 >= 0)and(iy1 < size))
+
 
                    deskOccupy[ix][iy1] += z;
+
for (int n = 0; n < n_desks; n++)
                if((iy2 >= 0)and(iy2 < size))
+
{
                    deskOccupy[ix][iy2] += z;
+
out << " \xdb";
            }
+
for (int i = 0; i < M * 2 + 2; i++)
    }
+
out << "\xdc";
    void setRook(int x, int y, int z)   //increase all cells occupied by rook at (x, y) on z
+
out << "\xdb";
    {
+
}
        for(int i = 0; i < size; i++)
+
out << endl << endl;
        {
+
}
            if(i != x)
+
 
                deskOccupy[i][y] += z;
+
// Вывести все возможные расположения на доске N фигур
            if(i != y)
+
void all_placements(int N, type t)
                deskOccupy[x][i] += z;
+
{
        }
+
desk = NULL;
    }
+
colons = rows = diag_1 = diag_2 = NULL;
    void setKing(int x, int y, int z)  //increase all cells occupied by king at (x, y) on z
+
// создание необходимых массивов, отмечающих занятость клеток, в зависимости от вида фигуры
    {
+
if (t == peshka || t == king || t == kon)
        for(int ix = x - 1; ix <= x + 1; ix++)
+
{
            for(int iy = y - 1; iy <= y + 1; iy++)
+
desk = new int*[M];
                if((ix >= 0)and(ix < size)and(iy >= 0)and(iy < size)and((ix != 0)or(iy != 0)))
+
for (int j = 0; j < M; j++)
                    deskOccupy[ix][iy] += z;
+
desk[j] = new_array(M);
    }
+
}
    void setFigure(int x, int y, int z, char figure)   //increase all cells occupied by figure
+
else
                                                        //and (x, y) on z
+
{
    {
+
if (t == ladya || t == queen)
        deskOccupy[x][y] += z;
+
{
        switch(figure)
+
colons = new_array(M);
        {
+
rows = new_array(M);
            case 'N':
+
}
                setKnight(x, y, z);
+
if (t == slon || t == queen)
                break;
+
{
            case 'B':
+
diag_1 = new_array(2*M-1);
                setBishop(x, y, z);
+
diag_2 = new_array(2*M-1);
                break;
+
}
            case 'R':
+
}
                setRook(x, y, z);
+
                break;
+
const int W = 80 / (2 * M + 5);//количество досок,помещающихся на экране
            case 'Q':
+
point **figures = new point*[W];//массив фигур
                setBishop(x, y, z);
+
for (int j = 0; j < W; j++)
                setRook(x, y, z);
+
figures[j] = new point[N];
                break;
+
 
            case 'K':
+
int i = 0, // номер фигуры
                setKing(x, y, z);
+
k = 0; //номер комбинации
                break;
+
while (true)
        }
+
{
    }
+
if (rest(figures[k%W][i], t) < N - i) // если оставшиеся фигуры не помещаются на доске
    bool putFigure(int x, int y, char figure)   //place figure on desk and update occupied cells
+
{
    {
+
if (i == 0) // если все комбинации закончились
        if(deskFigures[x][y] > 0)
+
{
            return false;
+
// вывод оставшихся досок
        deskFigures[x][y] = figure;
+
if (k % W)
        if(stackIsUsed)
+
print(figures, k % W, N, t);
            s -> push_back(make_pair(x, y));
+
cout << "Amount of combinations: " << k << endl;
        setFigure(x, y, 1, figure);
+
break;
        f++;
+
}
        return true;
+
// переходим к предыдущей фигуре и помечаем клетку пустой
    }
+
set(figures[k%W][--i], t, NONE);
    int cellsLeft() //amount of cells after pointer
+
// сдвигаем фигуру на шаг вперёд
    {
+
++figures[k%W][i];
        return (size - y) * size - x;
+
}
    }
+
else if (!empty(figures[k%W][i], t, i)) // если фигуры помещаются, но текущая клетка под ударом
    bool putNextFree(char figure)  //attempt to put figure on the next free(and not occupied) place
+
// сдвигаем текущую фигуру на шаг вперёд
    {
+
++figures[k%W][i];
        if(y >= size)
+
else if (i == N - 1) // если ставим последнюю фигуру
            return false;
+
{
        while(deskOccupy[x][y] > 0)
+
// если текущая доска - последняя на строке экрана, выводим W досок
        {
+
if ((k + 1) % W == 0)
            if(++x == size)
+
print(figures, W, N, t);
            {
+
// копирование комбинаций фигур на следующую доску
                if(++y == size)
+
for (int j = 0; j < N; j++)
                    return false;
+
figures[(k+1)%W][j] = figures[k%W][j];
                x = 0;
+
// переход к следующей доске
            }
+
k++;
        }
+
//сдвигаем текущую фигуру на шаг вперёд
        return putFigure(x, y, figure);
+
++figures[k%W][i];
    }
+
}
    void removeFigure(int x, int y) //remove figure from (x, y)
+
else // если ставим не последнюю фигуру
    {
+
{
        if(deskFigures[x][y]!=0)
+
// помечаем текущую клетку номером i
            setFigure(x, y, -1, deskFigures[x][y]);
+
set(figures[k%W][i], t, i);
        deskFigures[x][y] = 0;
+
//ставим следующую фигуру на клетку после текущей
        f--;
+
figures[k%W][i+1] = figures[k%W][i].next();
    }
+
// переходим к следующей фигуре
    void removeBishop(int diag, bool color, bool left)  //remove bishop
+
i++;
    {
+
}
        if(color)  //true - white, false - black
+
}
        {
+
 
            if(diag > 0)    //diag - number of diagonal
+
//освобождение памяти
            {
+
for (int j = 0; j < W; j++)
                int diff = left ? 0 : diag * 2;
+
delete[] figures[j];
                removeFigure(diff, diag * 2 - diff);
+
delete[] figures;
                removeFigure(size - diff - 1, size - diag * 2 + diff - 1);
+
if (desk)
            }
+
{
            else
+
for (int j = 0; j < M; j++)
            if(left)    //determine position of the bishop on the diagonal
+
delete[] desk[j];
                removeFigure(0, 0);
+
delete[] desk;
            else
+
}
                removeFigure(size - 1, size - 1);
+
if (colons)
        }
+
{
        else
+
delete[] colons;
        {
+
delete[] rows;
            if(diag > 0)
+
}
            {
+
if (diag_1)
                int diff = left ? 0 : diag * 2;
+
{
                removeFigure(size - diff - 1, diag * 2 - diff);
+
delete[] diag_1;
                removeFigure(diff, size - diag * 2 + diff - 1);
+
delete[] diag_2;
            }
+
}
            else
+
}
            if(left)
+
 
                removeFigure(0, size - 1);
+
 
            else
+
int main()
                removeFigure(size - 1, 0);
+
{
        }
+
system("color 70"); // Установка серого фона и чёрного текста
    }
+
while (true)
    void putBishop(int diag, bool color, bool left) //place bishop
+
{
    {
+
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";
        if(color)
+
char c;
        {
+
cin >> c;
            if(diag > 0)
+
cin.ignore(100, '\n');
            {
+
switch (c)
                int diff = left ? 0 : diag * 2;
+
{
                putFigure(diff, diag * 2 - diff, 'B');
+
case '1':
                putFigure(size - diff - 1, size - diag * 2 + diff - 1, 'B');
+
case '2':
            }
+
cout << "Enter the desk size please. (The number must be even and not more than 37.)\n";
            else
+
cin >> M;
            if(left)
+
while (!cin || M % 2 != 0 || M > 37 || M <= 0)
                putFigure(0, 0, 'B');
+
{
            else
+
cout << "Error: wrong desk size. Try again please.\n";
                putFigure(size - 1, size - 1, 'B');
+
cin.clear();
        }
+
cin.ignore(100, '\n');
        else
+
cin >> M;
        {
+
}
            if(diag > 0)
+
cin.ignore(100, '\n');
            {
+
cout << "Choose a figure, please.\n p - peshka, k - kon, l - ladya, s - slon, Q - Queen, K - King\n";
                int diff = left ? 0 : diag * 2;
+
char f;
                putFigure(size - diff - 1, diag * 2 - diff, 'B');
+
cin >> f;
                putFigure(diff, size - diag * 2 + diff - 1, 'B');
+
cin.ignore(100, '\n');
            }
+
type t;
            else
+
int i;
            if(left)
+
do
                putFigure(0, size - 1, 'B');
+
{
            else
+
for (i = 0; i < 6; i++)
                putFigure(size - 1, 0, 'B');
+
{
        }
+
if (symbols[i] == f)
    }
+
{
    void swapBishops(int diag, bool color, bool left)   //move pair bishops to another borders
+
t = type(i);
    {
+
break;
        removeBishop(diag, color, left);
+
}
        putBishop(diag, color, not(left));
+
}
    }
+
if (i == 6)
    void figureBefore() //remove one figure from stack and change pointer to the next position after figure was placed
+
{
    {
+
cout << "Enter the right letter, you've chosen the wrong one.\n";
        pair<int, int> c = s -> back();
+
cin >> f;
        s -> pop_back();
+
cin.ignore(100, '\n');
        x = c.first;
+
}
        y = c.second;
+
} while (i == 6);
        removeFigure(x, y);
+
if (c == '1')
        if(++x == size)
+
{
        {
+
cout << "Enter the number of figures please.\n";
            x = 0;
+
int N;
            y++;
+
cin >> N;
        }
+
while (!cin || N <= 0)
    }
+
{
    void clear()   //clear the desk
+
cout << "Error: wrong argument. Try again please.\n";
    {
+
cin.clear();
        for(int ix = 0; ix < size; ix++)
+
cin.ignore(100, '\n');
            for(int iy = 0; iy < size; iy++)
+
cin >> N;
            {
+
}
                deskFigures[ix][iy] = 0;
+
cin.ignore(100, '\n');
                deskOccupy[ix][iy] = 0;
+
all_placements(N, t);
            }
+
}
        x = 0;
+
else
        y = 0;
+
{
        if(stackIsUsed)
+
cout << "The maximal number of figures is ";
            s -> empty();
+
switch (t)
        f = 0;
+
{
    }
+
case peshka:
    void show() //show the desk
+
cout << M*M/2; break;
    {
+
case king:
        a++;
+
cout << M*M/4; break;
        printf("%i:\n", a);
+
case kon:
        #ifdef windows
+
cout << (M == 2 ? 4 : M*M/2); break;
        unsigned background = 4;
+
case ladya:
        #else
+
cout << M; break;
        printf("\x1b[31m");
+
case slon:
        char background = 47;
+
cout << 2*M - 2; break;
        #endif  //windows
+
case queen:
        for(int y = 0; y < size; y++)
+
cout << (M == 2 ? 1 : M);
            for(int x = 0; x < size; x++)
+
}
            {
+
cout << ".\n";
                #ifdef windows
+
}
                SetConsoleTextAttribute(hCon, background);
+
break;
                #else
+
case 'q':
                printf("\x1b[%dm", background);
+
cout << endl;
                #endif  //windows
+
return 0;
                if(deskFigures[x][y] == 0)
+
default:
                    putchar(' ');
+
cout << "You've chosen the wrong command, try again please.\n";
                else
+
}
                    putchar(deskFigures[x][y]);
+
cout << endl << endl;
                #ifdef windows
+
}
                if(x < size - 1)
+
}
                    background = background == 4 ? 116 : 4;
+
</syntaxhighlight>
                else
+
</div>
                {
+
 
                    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
 
  
unsigned lookForFigure(int size, int amount, char figure, bool show = true) //brute-force
+
'''Инструкция''': В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей: либо максимальное число вариантов, либо посмотреть наглядно на варианты. Человек вводит размер доски и тип фигуры.
 +
 
 +
Скачать программу можно  [http://tm.spbstu.ru/:File:Шахматы0001.zip    ]
 +
 
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
 
 +
#define windows
 +
 
 +
#include <stdio.h>
 +
#include <vector>
 +
 
 +
#ifdef windows
 +
#include <windows.h>
 +
#endif  // windows
 +
 
 +
using namespace std;
 +
 
 +
#ifdef windows
 +
HANDLE hCon;
 +
#endif // windows
 +
 
 +
unsigned fact(int n) //factorial of a number
 
{
 
{
    desk *d  = new desk(size);
+
     unsigned long long ret = 1;
     unsigned ret = 0;
+
     for(int i = 2; i <= n; i++)
     while((d -> f > 0)or(d -> cellsLeft() >= amount))
+
         ret *= i;
        if(not(d -> putNextFree(figure)))
 
        {
 
            if(d -> f == amount)
 
            {
 
                if(show)
 
                    d -> show();
 
                ret++;
 
            }
 
            d -> figureBefore();
 
         }
 
    delete d;
 
 
     return ret;
 
     return ret;
 
}
 
}
  
void lookForKnight(int size, int amount)    //arrangements of knights
+
struct desk
 
{
 
{
     if(m == 0)
+
     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
         printf("Amount of arrangements: ");
+
    vector<pair<int, int> > *s; //stack of placed figures
         if(size == 2)
+
    bool stackIsUsed;  //if stack is needed
             printf("1\n");
+
    desk(int size, bool stackIsUsed = true):x(0), y(0), size(size), a(0), f(0), stackIsUsed(stackIsUsed)
        else
+
     {
         if(size == 4)
+
         deskFigures = new char*[size];
             printf("6\n");
+
        for(int i = 0; i < size; i++)
         else
+
            deskFigures[i] = new char[size];
            printf("2\n");
+
         deskOccupy = new char*[size];
 +
        for(int i = 0; i < size; i++)
 +
            deskOccupy[i] = new char[size];
 +
        if(stackIsUsed)
 +
             s = new vector<pair<int, int> >;
 +
        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;
 
     }
 
     }
     else
+
     void setKnight(int x, int y, int z) //increase all cells occupied by knight at (x, y) on z
 
     {
 
     {
        desk *d = new desk(size);
+
         if(x + 2 < size)
         if(size == 2)
 
 
         {
 
         {
             d -> putFigure(0, 0, 'N');
+
             if(y - 1 >= 0)
            d -> putFigure(0, 1, 'N');
+
                deskOccupy[x + 2][y - 1] += z;
             d -> putFigure(1, 0, 'N');
+
             if(y + 1 < size)
            d -> putFigure(1, 1, 'N');
+
                deskOccupy[x + 2][y + 1] += z;
            d -> show();
 
 
         }
 
         }
        else
+
         if(y + 2 < size)
         if(size==4)
 
            lookForFigure(size, amount, 'N');
 
        else
 
 
         {
 
         {
             for(int x = 0; x < size; x++)
+
             if(x - 1 >= 0)
                 for(int y = 0;y < size; y++)
+
                 deskOccupy[x - 1][y + 2] += z;
                    if(x + y % 2 == 0)
+
             if(x + 1 < size)
                        d -> putFigure(x, y, 'N');
+
                 deskOccupy[x + 1][y + 2] += z;
             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();
 
 
         }
 
         }
    }
+
        if(x - 2 >= 0)
}
 
 
 
void lookForBishop(int size, int amount)    //arrangements of bishops
 
{
 
    if(m == 0)
 
        printf("Amount of arrangements: %u", (unsigned) 1 << size);
 
    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);
+
             if(y - 1 >= 0)
             d -> putBishop(dw, false, false);
+
                deskOccupy[x - 2][y - 1] += z;
 +
             if(y + 1 < size)
 +
                deskOccupy[x - 2][y + 1] += z;
 
         }
 
         }
         int p = size - 1;
+
         if(y - 2 >= 0)
        for(;;)
 
 
         {
 
         {
             d -> show();
+
             if(x - 1 >= 0)
             while(b[p])
+
                deskOccupy[x - 1][y - 2] += z;
 +
             if(x + 1 < size)
 +
                deskOccupy[x + 1][y - 2] += z;
 +
        }
 +
    }
 +
    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--)
 +
            if(ix != x)
 
             {
 
             {
                 d -> swapBishops(p % (size / 2), p < size / 2, true);
+
                 if((iy1 >= 0)and(iy1 < size))
                b[p--] = false;
+
                    deskOccupy[ix][iy1] += z;
                 if(p < 0)
+
                 if((iy2 >= 0)and(iy2 < size))
                     return;
+
                     deskOccupy[ix][iy2] += z;
 
             }
 
             }
             b[p] = true;
+
    }
             d -> swapBishops(p % (size / 2), p < size / 2, false);
+
    void setRook(int x, int y, int z)  //increase all cells occupied by rook at (x, y) on z
            p = size - 1;
+
    {
 +
        for(int i = 0; i < size; i++)
 +
        {
 +
             if(i != x)
 +
                deskOccupy[i][y] += z;
 +
             if(i != y)
 +
                deskOccupy[x][i] += z;
 
         }
 
         }
 
     }
 
     }
}
+
    void setKing(int x, int y, int z)   //increase all cells occupied by king at (x, y) on z
 
+
     {
void lookForRook(int size, int amount) //arrangements of rooks
+
         for(int ix = x - 1; ix <= x + 1; ix++)
{
+
            for(int iy = y - 1; iy <= y + 1; iy++)
    if(m == 0)
+
                if((ix >= 0)and(ix < size)and(iy >= 0)and(iy < size)and((ix != 0)or(iy != 0)))
        printf("Amount of arrangements: %u", fact(size));
+
                    deskOccupy[ix][iy] += z;
     else
+
     }
         lookForFigure(size, amount, 'R');
+
    void setFigure(int x, int y, int z, char figure)   //increase all cells occupied by figure
}
+
                                                        //and (x, y) on z
 
 
void lookForQueen(int size, int amount) //arrangements of queens
 
{
 
    if(m == 0)
 
        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');
 
}
 
 
 
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))
 
 
     {
 
     {
         printf("Size must be above 0 and even\n");
+
         deskOccupy[x][y] += z;
         goto sizeInput;
+
        switch(figure)
    }
+
         {
    modeInput:
+
            case 'N':
    printf("Enter mode:\n\t0: Print amount of results\n\t1: Print all results\n");
+
                setKnight(x, y, z);
     scanf("%i", &m);
+
                break;
     if((m<0)or(m>1))
+
            case 'B':
    {
+
                setBishop(x, y, z);
         printf("Mode can be 0 or 1\n");
+
                break;
         goto modeInput;
+
            case 'R':
 +
                setRook(x, y, z);
 +
                break;
 +
            case 'Q':
 +
                setBishop(x, y, z);
 +
                setRook(x, y, z);
 +
                break;
 +
            case 'K':
 +
                setKing(x, y, z);
 +
                break;
 +
        }
 +
    }
 +
     bool putFigure(int x, int y, char figure)   //place figure on desk and update occupied cells
 +
     {
 +
        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;
 
     }
 
     }
     figureInput:
+
     int cellsLeft() //amount of cells after pointer
    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((f<0)or(f>4))
 
 
     {
 
     {
         printf("Figure number ranges from 0 to 4\n");
+
         return (size - y) * size - x;
        goto figureInput;
 
 
     }
 
     }
     switch(f)
+
     bool putNextFree(char figure)   //attempt to put figure on the next free(and not occupied) place
 
     {
 
     {
         case 0:
+
         if(y >= size)
             if(s==2)
+
            return false;
                 lookForKnight(s, 4);
+
        while(deskOccupy[x][y] > 0)
            else
+
        {
                 lookForKnight(s, s *s / 2);
+
             if(++x == size)
             break;
+
            {
         case 1:
+
                 if(++y == size)
            lookForBishop(s, 2 * s - 2);
+
                    return false;
            break;
+
                 x = 0;
        case 2:
+
             }
            lookForRook(s, s);
+
         }
            break;
+
        return putFigure(x, y, figure);
         case 3:
+
    }
            if(s==2)
+
    void removeFigure(int x, int y) //remove figure from (x, y)
                lookForQueen(s, 1);
+
    {
            else
+
         if(deskFigures[x][y]!=0)
                lookForQueen(s, s);
+
            setFigure(x, y, -1, deskFigures[x][y]);
            break;
+
        deskFigures[x][y] = 0;
         case 4:
+
         f--;
            lookForKing(s, (s / 2) * (s / 2));
 
            break;
 
 
     }
 
     }
     return 0;
+
     void removeBishop(int diag, bool color, bool left)  //remove bishop
}
+
    {
 
+
        if(color)   //true - white, false - black
 
+
        {
 
+
            if(diag > 0)   //diag - number of diagonal
</syntaxhighlight>
+
            {
</div>
+
                int diff = left ? 0 : diag * 2;
 
+
                removeFigure(diff, diag * 2 - diff);
 
+
                removeFigure(size - diff - 1, size - diag * 2 + diff - 1);
'''[[Сенников Иван]]'''
+
            }
 
+
            else
'''Суть программы:''' Программа позволяет на шахматной доске MxM расставить N фигур K типа всевозможными способами, причем при этом производится расчет максимального количества фигур K типа, которые можно расставить на данной доске MxM.
+
            if(left)    //determine position of the bishop on the diagonal
 
+
                removeFigure(0, 0);
'''Идея:''' Шахматная доска представляет собой двумерный динамический массив. С помощью рекурсивного метода программа пробегает по массиву, проверяя клетки доски по всем направлениям на то, атакованы ли они другими фигурами этого типа. В зависимости от количества поставленных фигур изменяется количество итераций. В новую клетку ставиться новая фигура и так до тех пор, пока не выполнится написанное выше условие, после чего начнется обратный ход.
+
            else
 
+
                removeFigure(size - 1, size - 1);
'''Инструкция:''' Программа написана в виде меню на английском языке: пользователю будет предоставлена возможность сначала обозначить размер доски, а после выбрать тип фигур и их количество для дальнейшей работы с ними. Комментарии к программе написаны также на английском языке.
+
        }
 
+
        else
Ссылка для скачиваний: [http://tm.spbstu.ru/Файлы:Chess_v2.0.zip здесь].
+
        {
 
+
            if(diag > 0)
'''[[Степанянц Степан]]'''
+
            {
 
+
                int diff = left ? 0 : diag * 2;
'''Программа''': 1)Программа получает все возможные варианты расстановок одинаковых фигур на поле боя(шахматной доске) так, чтобы они не смогли бить друг друга.2)Программа выводит максимальное число фигур, которые можно поставить на шахматную доску nxn так, чтобы они не смогли бить друг друга.
+
                removeFigure(size - diff - 1, diag * 2 - diff);
 
+
                removeFigure(diff, size - diag * 2 + diff - 1);
'''Идея алгоритма''': Функция вызывает саму себя(рекурсия) в рекурсии фигура ставится на небьющуюся клетку и помечаются клетки, которые бьются этой фигурой.Если дальше ставить нельзя, то начинается обратный ход:фигура убирается, и запоминается место, где она стояла, и вновь вызывается функция.
+
            }
 
+
            else
Скачать можно  [http://tm.spbstu.ru/Файл:Шахматы.rar тут].
+
            if(left)
 
+
                removeFigure(0, size - 1);
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
            else
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
                removeFigure(size - 1, 0);
#include <iostream>
+
         }
#include <vector>
+
     }
 
+
    void putBishop(int diag, bool color, bool left) //place bishop
using namespace std;
+
    {
 
+
        if(color)
 
+
        {
 
+
            if(diag > 0)
//задаю массивы в которых изображены все ходы определенных фигур
+
            {
int d = 0;
+
                int diff = left ? 0 : diag * 2;
int d_knight[2][8] = {{1, 1, -1, -1, 2, 2, -2, -2},
+
                putFigure(diff, diag * 2 - diff, 'B');
    {2, -2, 2, -2, 1, -1, 1, -1}};
+
                putFigure(size - diff - 1, size - diag * 2 + diff - 1, 'B');
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}};
+
            else
//Проверяем, не выходим ли мы за поле
+
             if(left)
bool ok(int x, int y, int n) {
+
                putFigure(0, 0, 'B');
    if (x < 0 || y < 0 || x >= n || y >= n)
+
            else
         return false;
+
                putFigure(size - 1, size - 1, 'B');
     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';
+
         else
    }
+
        {
    cout << "-------------------------------------\n";
+
            if(diag > 0)
}
+
            {
//Рекурсивная функция
+
                int diff = left ? 0 : diag * 2;
int func(int n, int k, int count, vector<vector<pair<bool, int> > > board, int ii, int jj, int fig, int task) {
+
                putFigure(size - diff - 1, diag * 2 - diff, 'B');
     int ans = 0;
+
                putFigure(diff, size - diag * 2 + diff - 1, 'B');
     if (count == k && !task) {
+
            }
         print(n, board);
+
            else
         return 1;
+
            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
 +
    {
 +
         removeBishop(diag, color, left);
 +
         putBishop(diag, color, not(left));
 
     }
 
     }
     else if(task) {
+
     void figureBefore() //remove one figure from stack and change pointer to the next position after figure was placed
         ans = max(ans, count);
+
    {
 +
         pair<int, int> c = s -> back();
 +
        s -> pop_back();
 +
        x = c.first;
 +
        y = c.second;
 +
        removeFigure(x, y);
 +
        if(++x == size)
 +
        {
 +
            x = 0;
 +
            y++;
 +
        }
 
     }
 
     }
     for (int i = ii + jj / n; i < n; i++) {
+
     void clear()    //clear the desk
         for (int j = jj % n; j < n; j++) {
+
    {
             if (!board[i][j].first && !board[i][j].second) {
+
         for(int ix = 0; ix < size; ix++)
                switch (fig) {
+
             for(int iy = 0; iy < size; iy++)
                    case 1://конь
+
            {
                        for (int k = 0; k < 8; k++) {
+
                deskFigures[ix][iy] = 0;
                            if (ok(i + d_knight[0][k], j + d_knight[1][k], n))
+
                deskOccupy[ix][iy] = 0;
                                board[i + d_knight[0][k]][j + d_knight[1][k]].second++;
+
            }
                        }
+
        x = 0;
                        break;
+
        y = 0;
                    case 2://слон
+
        if(stackIsUsed)
                        for (int k = 0; k < n; k++) {
+
            s -> empty();
                            for (int l = 0; l < 4; l++) {
+
        f = 0;
                                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++;
+
    void show() //show the desk
                            }
+
    {
                        }
+
        a++;
                        break;
+
        printf("%i:\n", a);
                    case 3: // ладья
+
        #ifdef windows
                        for (int k = 0; k < n; k++)
+
        unsigned background = 4;
                            board[i][k].second++, board[k][j].second++;
+
        #else
                        break;
+
        printf("\x1b[31m");
                    case 4: // король
+
        char background = 47;
                        for (int k = 0; k < 8; k++)
+
        #endif  //windows
                            if (ok(i + d_king[k][0], j + d_king[k][1], n))
+
        for(int y = 0; y < size; y++)
                                board[i + d_king[k][0]][j + d_king[k][1]].second++;
+
            for(int x = 0; x < size; x++)
                        break;
+
            {
                    case 5: // ферзь
+
                #ifdef windows
                        for (int k = 0; k < 8; k++)
+
                SetConsoleTextAttribute(hCon, background);
                            for (int l = 0; l < n; l++)
+
                #else
                                if (ok(i + l * d_king[k][0], j + l * d_king[k][1], n))
+
                printf("\x1b[%dm", background);
                                    board[i + l * d_king[k][0]][j + l * d_king[k][1]].second++;
+
                #endif  //windows
                        break;
+
                if(deskFigures[x][y] == 0)
                       
+
                    putchar(' ');
                 }
+
                else
                 //Рекурсия
+
                    putchar(deskFigures[x][y]);
                board[i][j].first = true;
+
                #ifdef windows
                 if (!task)
+
                if(x < size - 1)
                     ans += func(n, k, count + 1, board, i, j + 1, fig, task);
+
                    background = background == 4 ? 116 : 4;
              //обратный ход
+
                else
 +
                {
 +
                    SetConsoleTextAttribute(hCon, 7);
 +
                    putchar('\n');
 +
                 }
 +
                 #else
 +
                 if(x < size - 1)
 +
                     background = background == 47 ? 40 : 47;
 
                 else
 
                 else
                    ans = max(ans, func(n, k, count + 1, board, i, j + 1, fig, task));
+
                 {
                 board[i][j].first = false;
+
                     printf("\x1b[0m\n");
                switch (fig) {
+
                     if(y < size - 1)
                     case 1:
+
                         printf("\x1b[31m");
                        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--;
 
                        }
 
                        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;
 
 
                 }
 
                 }
 +
                #endif // windows
 
             }
 
             }
        }
 
        jj = 0;
 
 
     }
 
     }
    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 m = -1; //0 for number of arrangements, 1 for all variants
  
Программа работает в двух режимах: поиск максимального числа фигур для заданного поля и количество возможных расстановок заданного числа фигур для заданного поля.
+
unsigned lookForFigure(int size, int amount, char figure, bool show = true) //brute-force
 
+
{
'''Алгоритм:''' 
+
    desk *d = new desk(size);
 
+
    unsigned ret = 0;
#Для поиска количества возможных расстановок заданного числа фигур для заданного поля – Проверяется, возможно ли поставить фигуру в данную клетку, рекурсивно перебирает для каждой клетки поля, как начальной клетки, все варианты расстановки заданного количества  фигур относительно нее и выводит на экран все расстановки, которые подходят условиям.
+
    while((d -> f > 0)or(d -> cellsLeft() >= amount))
#Для поиска максимального числа фигур для заданного поля –  Проверяется, можно ли поставить одну фигуру, две, три и так далее, пока фигур больше поставить будет нельзя.
+
        if(not(d -> putNextFree(figure)))
 
+
         {
Скачать можно [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  тут].
+
            if(d -> f == amount)
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
             {
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
                if(show)
#include <vector>
+
                    d -> show();
#include <iostream>
+
                ret++;
#include <algorithm>
+
            }
 
+
            d -> figureBefore();
 
+
         }
using namespace std;
+
    delete d;
 
+
     return ret;
int n,k, o, m, l, g, maxi, a, sum=0,y, mozno=1;//mozno=1 если можно поставить n фигур
 
vector<vector<int> > matrix;// двухмерный вектор
 
 
 
bool ladia(int x, int y) {      //проверка, можно ли в эту клетку поставить ладью
 
    for(int i = 0; i<n; i++)
 
         if(matrix[x][i] == 1)
 
             return false;
 
    for(int j=0; j<n; j++)
 
         if(matrix[j][y]==1)
 
            return false;
 
     return true;
 
 
}
 
}
  
bool slon(int x, int y) {  //   --//-- слона
+
void lookForKnight(int size, int amount)    //arrangements of knights
 
+
{
  for (int i=x, j=y;i<n && j>=0; i++, j--)
+
    if(m == 0)
      if(matrix[i][j] == 1)
+
    {
             return false;
+
        printf("Amount of arrangements: ");
  for (int i=x, j=y;i>=0 && j>=0; i--, j--)
+
        if(size == 2)
      if(matrix[i][j] == 1)
+
             printf("1\n");
             return false;
+
        else
  for (int i=x, j=y;i>=0 && j<n; i--, j++)
+
        if(size == 4)
      if(matrix[i][j] == 1)
+
            printf("6\n");
             return false;
+
        else
  for (int i=x, j=y;i<n && j<n; i++, j++)
+
            printf("2\n");
      if(matrix[i][j] == 1)
+
    }
             return false;
+
    else
 
+
    {
    return true;
+
        desk *d = new desk(size);
 
+
        if(size == 2)
}
+
        {
 
+
             d -> putFigure(0, 0, 'N');
bool fruz(int x, int y){      //    --//-- ферзя
+
            d -> putFigure(0, 1, 'N');
    if(slon(x,y) && ladia(x,y))
+
            d -> putFigure(1, 0, 'N');
         return true;
+
            d -> putFigure(1, 1, 'N');
 
+
            d -> show();
     return false;
+
        }
 
+
        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();
 +
         }
 +
     }
 
}
 
}
  
bool kon(int x, int y) // --//-- коня
+
void lookForBishop(int size, int amount)   //arrangements of bishops
 
+
{
  if (x-1>=0 && y-2>=0 && matrix[x-1][y-2]==1)
+
    if(m == 0)
         return false;
+
        printf("Amount of arrangements: %u", (unsigned) 1 << size);
  if (y-2>=0 && x+1<n && matrix[x+1][y-2]==1)
+
    else
         return false;
+
    {
  if (x-2>=0 && y-1>=0 && matrix[x-2][y-1]==1)
+
        desk *d = new desk(size, false);
        return false;
+
         bool *b = new bool[size];
  if (x+2<n && y-1>=0 && matrix[x+2][y-1]==1)
+
        for(int dw = 0; dw < size/2; dw++)
        return false;
+
         {
  if (x-2>=0 && y+1<n && matrix[x-2][y+1]==1)
+
            d -> putBishop(dw, true, false);
        return false;
+
            d -> putBishop(dw, false, false);
  if (x+2<n && y+1<n && matrix[x+2][y+1]==1)
+
        }
        return false;
+
        int p = size - 1;
  if (x-1>=0 && y+2<n && matrix[x-1][y+2]==1)
+
        for(;;)
        return false;
+
        {
  if (x+1<n && y+2<n && matrix[x+1][y+2]==1)
+
            d -> show();
         return false;
+
            while(b[p])
return true;
+
            {
 +
                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;
 +
         }
 +
    }
 
}
 
}
  
bool king(int x, int y) {  // --//--  короля
+
void lookForRook(int size, int amount) //arrangements of rooks
 
+
{
     if (x-1>=0 && y-1>=0 && matrix[x-1][y-1]==1)
+
     if(m == 0)
         return false;
+
         printf("Amount of arrangements: %u", fact(size));
    if (x-1>=0 && matrix[x-1][y]==1)
+
     else
        return false;
+
         lookForFigure(size, amount, 'R');
    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;
 
 
 
 
}
 
}
  
int mass() // вывод доски на экран
+
void lookForQueen(int size, int amount) //arrangements of queens
 
+
{
for(int i = 0; i<n; i++)
+
     if(m == 0)
  {
+
         printf("Amount of arrangements: %u", lookForFigure(size, amount, 'Q', false));
 
+
    else
     for(int j = 0; j<n; j++)
+
         lookForFigure(size, amount, 'Q');
         cout<<matrix[i][j]<<" ";
 
 
 
         cout<<endl;
 
    }
 
 
 
 
}
 
}
  
int del() { // очистка доски(все нули)
+
void lookForKing(int size, int amount)  //arrangements of kings
 
+
{
for (int i=0; i<n; i++) {
+
    if(m == 0)
 
+
        printf("Amount of arrangements: %u", lookForFigure(size, amount, 'K', false));
     for (int j=0; j<n; j++)
+
     else
        matrix[i][j]=0;
+
        lookForFigure(size, amount, 'K');
 
}
 
}
  
}
+
int main()
 
+
{
 
+
    int s = -1, f = -1; //s - size, f - figure
 
+
     #ifdef windows
void vsevarintyrasstavitnfigur(int x,int y){  // рекурсивный поиск всех вараинтов расстановок заданнного количества фигур (x - номер фигуры в доске, если ее растянуть в линию, y - кол-во фигур)
+
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
     if(y==0) {
+
    #endif // windows
        if (a==1){
+
    sizeInput:
            mass();
+
    printf("Enter size of the desk:\n");
            cout<<'\n';
+
    scanf("%i", &s);
        }
+
    if((s<=0)or(s%2!=0))
        if(a==2) {
+
    {
                mozno = 1; //mozno=1 если можно поставить n фигур
+
        printf("Size must be above 0 and even\n");
 
+
         goto sizeInput;
        }
 
 
 
         return;
 
 
     }
 
     }
 
+
    modeInput:
     for(int i=x;i<n*n;i++){
+
     printf("Enter mode:\n\t0: Print amount of results\n\t1: Print all results\n");
 
+
    scanf("%i", &m);
        if (o==1)
+
    if((m<0)or(m>1))
        if(fruz(i/n,i%n) && y>0) {matrix[i/n][i%n]=1; y--;}
+
    {
 
+
         printf("Mode can be 0 or 1\n");
        if (o==2)
+
         goto modeInput;
        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++;
 
 
 
 
     }
 
     }
 
+
    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");
 
+
    scanf("%i", &f);
void maxfig(){ //поиск максимального количества фигур
+
    if((f<0)or(f>4))
     int i=0;
+
    {
while(mozno==1){ //проверяет для данной доски возможность расставить 1,2... фигуры, пока не доходит до количества, которое расставить невозхможно. Тогда это количество фигур -1 - искомая величина
+
        printf("Figure number ranges from 0 to 4\n");
         i++;
+
        goto figureInput;
         mozno=0;
+
    }
         vsevarintyrasstavitnfigur(0,i);
+
    switch(f)
 +
     {
 +
        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;
 
     }
 
     }
     setlocale(LC_ALL, "Russian");
+
     return 0;
    cout<<"Максимальное количество фигур = "<<i-1<<endl;
 
 
}
 
}
  
  
int main() {
 
setlocale(LC_ALL, "Russian");
 
    g=0;
 
    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;
+
</syntaxhighlight>
          cin>>a;
+
</div>
 +
 
 +
 
 +
'''[[Сенников Иван]]'''
  
        while(2>1){
+
'''Суть программы:''' Программа позволяет на шахматной доске MxM расставить N фигур K типа всевозможными способами, причем при этом производится расчет максимального количества фигур K типа, которые можно расставить на данной доске MxM.
            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;
 
  
 +
'''Инструкция:''' Программа написана в виде меню на английском языке: пользователю будет предоставлена возможность сначала обозначить размер доски, а после выбрать тип фигур и их количество для дальнейшей работы с ними. Комментарии к программе написаны также на английском языке.
  
 +
Ссылка для скачиваний: [http://tm.spbstu.ru/Файлы:Chess_v2.0.zip здесь].
  
  
 +
'''[[Козловская Анна]]'''
  
 +
'''Краткое описание алгоритма:''' Доска представлена в виде динамического массива[m;m], при выводе на экран пустые клетки обозначаются звездочками,а клетки, заполненные фигурами-буквами(каждая буква соответствует первой букве названия фигуры на английском языке). Для всех фигур написаны алгоритмы проверки на возможность расстановки фигуры. После выбора типа фигуры,используется рекурсивная функция,которая проверяет возможные расстановки через данную функцию проверки ,для данного типа фигуры. Во втором варианте работы программы,она аналитически высчитывает максимально возможное количество заданных фигур на доске.В программу встроена функция,проверяющая доску на повторные и симметричные относительно всех осей симметрии способы расстановки фигур.
  
    if (o==1)   {
+
'''Инструкция:''' В меню указывается два варианта развития событий. Пользователь должен выбрать один из путей. Он вводит размер доски и тип фигуры и кол-во фигур(для первого типа работы программы).Если он выбирает первый вариант работы программы  - вывод всех различных расстановок N фигур.Другой вариант работы программы максимальное число расстановок- программа выводит их количество.
                cout<<"Ферзь"<<endl;
 
  
            if(a==1)
+
Скачать можно  [http://tm.spbstu.ru/File:Chess3.rar тут].
                {
 
                    cin>>y;
 
                    vsevarintyrasstavitnfigur(0,y);
 
                }
 
  
  
            if (a==2)
+
'''[[Абрамов Игорь]]'''
                maxfig();
 
  
                }
+
'''Алгоритм''': в зависимости от выбранного режима работы, после ввода пользователем необходимой информации о размере поля а также типе расставляемых фигур, запускается основная рекурсивная функция, которая либо подсчитывает все возможные расстановки для заданного числа фигур и выводит их в файл, либо рассчитывает максимально возможное расставляемое число фигур. В первом режиме это происходит путём установки фигуры в свободную клетку и отметки клеток, которые бьются данной фигурой, затем запускается эта же функция для оставшихся клеток и т.д., пока число поставленных фигур не дойдёт до числа, заданного пользователем. Тогда эта расстановка выводится в файл и счётчик числа расстановок увеличивается на единицу. Во втором режиме как только находится расстановка для данного количества фигур, функция завершает свою работу, увеличивается счётчик количества фигур и функция вызывается уже для большего количества фигур, пока не будет найдено максимально возможное расставляемое на данной доске число фигур. 
  
 +
'''Инструкция''': В меню пользователю предлагается указать размеры доски, тип расставляемых фигур и режим работы программы. После этого, если был выбран режим вывода всех расстановок, необходимо ввести количество расставляемых фигур, после чего программа выведет на экран количество расстановок, а в файле "output.txt" появятся изображения всех расстановок. При выборе второго режима, на экран будет выведено максимальное число фигур заданного типа, которые можно расставить на данной доске.
  
 +
Ссылка для скачивания:[http://tm.spbstu.ru/File:Chess_Abramov.rar]
  
 +
<br>'''[[Нарядчиков Александр]]'''<br>
 +
'''Инструкция:''' Запустить программу, следовать указаниям, полученным в меню программы.<br>
 +
'''Описание программы:''' Шахматное поле представлено в виде двумерного массив 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
 +
*/
  
 +
#include "CHESS.h"
  
 +
/* Main function */
 +
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 (o==2)   {
+
// Консольное меню
                cout<<endl<<"Ладья"<<endl;
+
while (IsReady == 1)
 +
{
 +
cout << "Input figure type:\n1 - castle\n2 - bishop\n3 - knight\n4 - queen\n5 - king\n";
 +
cin >> tmp;
  
                    if(a==1)
+
cout << "Input number of rows on the field:\n";
                    {
+
cin >> N;
  
                        cin>>y;
+
cout << "Input number of columns on the field:\n";
                        vsevarintyrasstavitnfigur(0,y);
+
cin >> M;
                    }
 
  
                    if (a==2)
+
// Поле шахмат
                        maxfig();
+
chess desk(N, M);
  
                }
+
// Обнуление поля
 +
desk.Clear();
  
 +
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";
 +
cin >> IsCount;
  
    if (o==3)   {
+
// Если идет поиск всех расстановок
                cout<<endl<<"Слон"<<endl;
+
if (IsCount == 0)
 +
{
 +
cout << "Input number of chessmen on the field:\n";
 +
cin >> Number;
  
                if(a==1)
+
// Создание файла и его открытие
                    {
+
fopen_s(&F, "chess.txt", "wt");
                    cin>>y;
+
if ((type)(tmp + 1) == 2)
                    vsevarintyrasstavitnfigur(0,y);
+
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);
  
                    if (a==2)
+
// Количество разных расстановок
                    maxfig();
+
count = desk.FillField(IsCount, (type)(tmp + 1), 0, 0, Number, 0);
  
                }
+
// Открытие файла в режиме повторной записи
 +
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 (o==4) {
+
// Если идет поиск максимального числа фигур на доске
                cout<<endl<<"Конь"<<endl;
+
else if (IsCount == 1)
 +
{
 +
while (desk.FillField(IsCount, (type)(tmp + 1), 0, 0, max_value, 0))
 +
max_value++;
 +
cout << "The maximum number of chessmen on the board is " << (max_value - 1) << endl;
 +
max_value = 1;
 +
}
  
                if(a==1)
+
// Если было введено некорректное значение для IsCount
                    {
+
else
                    cin>>y;
+
cout << "Error\n";
                    vsevarintyrasstavitnfigur(0,y);
 
                    }
 
                    if (a==2)
 
                    maxfig();
 
  
              }
+
// Продолжение работы с программой
 +
cout << "Press '1' if you want to continue\nPress another number if you want to exit\n";
 +
cin >> IsReady;
  
    if (o==5)   {
+
if (IsReady == 1)
                cout<<"Король"<<endl;
+
continue;
 +
else
 +
exit(0);
 +
}
  
                if(a==1)
+
return 0;
                {
+
} // End of 'main' function
                    cin>>y;
 
                    vsevarintyrasstavitnfigur(0,y);
 
  
                }
+
// END OF 'T04CHESS.CPP' FILE
                if (a==2)
+
</syntaxhighlight>
 
+
"'''CHESS.CPP'''"
                      maxfig();
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: CHESS.CPP
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
                }
+
#include "CHESS.H"
  
            }
+
// Количество расстановок
}
+
int Result_count = 0;
  
 +
/* Clear field function */
 +
// Обнуление поля
 +
void chess::Clear( void )
 +
{
 +
// Все клетки свободны
 +
for (int i = 0; i < N; i++)
 +
for (int j = 0; j < M; j++)
 +
Field[i][j] = Free;
 +
} // End of 'Clear' function
  
</syntaxhighlight>
+
/* Check if the cell is available that function */
</div>
+
// Проверка, свободна и существует ли данная клетка
 +
int chess::IsAvailable( int x, int y )
 +
{
 +
if (x >= 0 && y >= 0 && x < M && y < N)
 +
if (Field[y][x] == Free)
 +
  return 1;
 +
 +
return 0;
 +
} // End of 'IsAvailable' function
  
'''[[Тимошенко Валентина]]'''
+
/* Output field in file function */
 +
// Запись одного поля в файл
 +
void chess::OutputInFile( void )
 +
{
 +
// Создание указателя на тип FILE
 +
FILE *F;
  
'''Краткое описание алгоритма''': доска представлена в виде динамического массива, при выводе на экран пустые клетки обозначаются точками, а клетки, заполненные фигурами, обозначаются буквами (каждая буква соответствует первой букве названия фигуры на английском языке). Для каждой фигуры написаны функции проверки на возможность установки фигуры и функции расстановки. Кроме того, программа аналитически считает максимальное количество фигур для доски заданного пользователем размера и, при наличии команды пользователя, выводит все возможные расстановки рассчитанного максимального количества фигур на экран.
+
// Открытие файла в режиме повторной записи
 +
fopen_s(&F, "chess.txt", "at");
  
'''Инструкция''': при запуске программа предлагает пользователю ввести размер доски, при этом число должно быть четным (если же пользователь вводит нечетное число, программа предлагает ввести размер еще раз, и так до тех пор, пока не будет введено четное число). Далее пользователь выбирает режим работы программы - либо расстановка фигур, либо расчет максимального количества фигур. В режиме расстановки фигур программа предлагает выбрать тип фигуры, выводит максимальное число фигур для доски заданного размера и предлагает ввести желаемое число фигур для расстановки (если оно больше максимального, предлагается повторная попытка ввода). В режиме расчета максимального числа программа предлагает выбрать тип фигуры, выводит рассчитанное число и задает вопрос о необходимости вывода всех возможных расстановок максимального количества для данной фигуры. Оба режима работают (т.е. все запросы повторяются) до тех пор, пока пользователь не даст команду на завершение цикла. Кроме того, в программе есть возможность изменения размера доски после выхода из всех циклов. При положительном ответе пользователя и изменении размера доступны оба режима работы.
+
// Переход на следующую строку файла
 +
fputc('\n', F);
  
Скачать можно  [http://tm.spbstu.ru/Файл:Chessboard.zip здесь].
+
// Заполнение файла текущем полем
 +
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);
 +
}
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
// Закрытие файла
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
fclose(F);
 +
} /* End of 'OutputInFile' function */
  
#include <iostream> ///расстановка одинаковых шахматных фигур одного цвета на доске произвольного размера так, чтобы они друг друга не били
+
/* Copy desks function */
#include <cstring>
+
// Копирование поля
#include <cstdlib>
+
void chess::Copy( chess &desk2 )
#include <ctime>
+
{
 +
  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
  
using namespace std;
+
/* Fill field function */
int result_count = 0; ///переменная, в которую закладывается номер варианта расстановки фигур
+
// Заполнение полей и поиск максимального числа расстановок
int N; ///то количество фигур для расстановки, которое задает пользователь
+
// Chessmen_num - количество фигур, которое нужно поставить; Already_stood - количество, которое уже стоит
int **Board; ///двумерный массив для отображения шахматной доски
+
int chess::FillField( int IsCount, type set, int x, int y, int Chessmen_num, int Already_stood )
int M; /// размер шахматной доски
+
{
 +
int i, j, k, l;
 +
chess desk2(N, M);
  
///Функция вывода доски
+
// Обнуление поля
void showBoard(string F) ///данная функция отображает доску
+
desk2.Clear();
{
 
    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;
 
}
 
  
///Функции проверки и установки для ферзя
+
// Пробег по всем оставшимся клеткам поля, начиная с той, на которой мы закончили предыдущую итерацию
 
+
for (i = y; i < N; i++)
bool tryQueen(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
+
for (j = ((i == y) ? x : 0); j < M; j++)
{
+
{
    for (int i = 0; i < M; ++i) ///проверка единственности ферзя в строке
+
// Если клетка свободна
    {
+
if (Field[i][j] == Free)
        if(Board[a][i])
+
{
            return false;
+
// Копируем доску
    }
+
Copy(desk2);
 
+
    for(int i = 0; i < M; ++i) ///проверка единственности ферзя в столбце
+
// Множественный выбор типа фигуры
    {
+
switch (set)
        if(Board[i][b])
+
{
            return false;
+
// Ладья
    }
+
case castle:
 
+
for (k = 0; k < N; k++)  
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вверх
+
{
    {
+
// Движение по столбцу
        if(Board[a-i][b-i])
+
if (desk2.Field[k][j] == Free)
            return false;
+
  desk2.Field[k][j] = busy;  
    }
+
// Движение по строке
 
+
if (desk2.Field[i][k] == Free)
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вниз
+
  desk2.Field[i][k] = busy;  
    {
+
}
        if(Board[a+i][b+i])
+
break;
            return false;
+
// Слон
    }
+
case bishop:
 
+
// Выбор и поиск наибольшей существующей на поле диагонали
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности ферзя по диагонали влево-вниз
+
for (k = 1 - (N < M ? N : M); k < (N < M ? N : M); k++)
    {
+
{
        if(Board[a+i][b-i])
+
// Проход из левого верхнего угла до правого нижнего
            return false;
+
if (IsAvailable(j + k, i + k))
    }
+
desk2.Field[i + k][j + k] = busy;
 
+
// Проход из левого нижнего до правого верхнего
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности ферзя по диагонали вправо-вверх
+
if (IsAvailable(j + k, i - k))
    {
+
desk2.Field[i - k][j + k] = busy;
        if(Board[a-i][b+i])
+
}
            return false;
+
break;
    }
+
// Конь
 
+
case knight:
    return true; ///если в ходе проверки ферзей и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
// Ходы коня, k - приращение по X, l - по Y
}
+
k = -2, l = 1;
 
+
// Проверка возможности хода в данную клетку
void setQueen(int a, int count) ///функция расстановки ферзей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
+
if (IsAvailable(j + k, i + l))
{
+
desk2.Field[i + l][j + k] = busy;
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
+
    {
+
k = -2, l = -1;  
        if(tryQueen(a, b)) ///проверка данной клетки на возможность установки фигуры
+
// Проверка возможности хода в данную клетку
        {
+
if (IsAvailable(j + k, i + l))
            Board[a][b] = 1; ///установка ферзя в первую клетку поля, присваивание ей значения 1 (true)
+
desk2.Field[i + l][j + k] = busy;
 
+
            for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
+
k = -1, l = 2;  
                setQueen(i,count+1);
+
// Проверка возможности хода в данную клетку
 
+
if (IsAvailable(j + k, i + l))
            if(count+1 == N) /// если нужное количество фигур поставлено, то
+
desk2.Field[i + l][j + k] = busy;
                showBoard("Q"); /// вызов функции вывода шахматной доски на экран
+
 
+
k = -1, l = -2;
            Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
+
// Проверка возможности хода в данную клетку
        }
+
if (IsAvailable(j + k, i + l))
    }
+
desk2.Field[i + l][j + k] = busy;
}
+
 
+
k = 1, l = 2;  
///Функции проверки и установки для ладьи
+
// Проверка возможности хода в данную клетку
 
+
if (IsAvailable(j + k, i + l))
bool tryRook(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
+
desk2.Field[i + l][j + k] = busy;
{
+
    for (int i = 0; i < M; ++i) ///проверка единственности ладьи в строке
+
k = 1, l = -2;
    {
+
// Проверка возможности хода в данную клетку
        if(Board[a][i])
+
if (IsAvailable(j + k, i + l))
            return false;
+
desk2.Field[i + l][j + k] = busy;
    }
+
 
+
k = 2, l = 1;  
    for(int i = 0; i < M; ++i) ///проверка единственности ладьи в столбце
+
// Проверка возможности хода в данную клетку
    {
+
if (IsAvailable(j + k, i + l))
        if(Board[i][b])
+
desk2.Field[i + l][j + k] = busy;
            return false;
+
    }
+
k = 2, l = -1;
 
+
// Проверка возможности хода в данную клетку
    return true; ///если в ходе проверки ладей и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
if (IsAvailable(j + k, i + l))
}
+
desk2.Field[i + l][j + k] = busy;
 
+
break;
void setRook(int a, int count) ///функция расстановки ладей; a - очередная строка, count - счетчик количества фигур, которое необходимо расставить
+
// Ферзь
{
+
case queen:
    for(int b = 0; b < M; ++b) ///b - очередной столбец, расстановка идет по строкам
+
for (k = 0; k < N; k++)
    {
+
{
        if(tryRook(a, b)) ///проверка данной клетки на возможность установки фигуры
+
// Движение по столбцу
        {
+
if (desk2.Field[k][j] == Free)
            Board[a][b] = 1; ///установка ладьи в первую клетку, присваивание ей значения 1 (true)
+
desk2.Field[k][j] = busy;
 
+
// Движение по строке
            for(int i = a + 1; i < M; ++i) ///расстановка указанного пользователем количества фигур
+
if (desk2.Field[i][k] == Free)
                setRook(i,count+1);
+
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;
 +
}
  
            if(count+1 == N) /// если нужное количество фигур поставлено, то
+
// Если количество поставленных фигур равно необходимому числу фигур
                showBoard("R"); /// вызов функции вывода шахматной доски на экран
+
else if ((Already_stood + 1) == Chessmen_num)
 
+
{
            Board[a][b]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
+
// Если идет поиск всех расстановок, то увеличиваем количество расстоновок на одну и записываем поле в файл 
        }
+
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
 +
*/
  
bool tryEl(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
+
#ifndef __CHESS_H_
{
+
#define __CHESS_H_
    for(int i = 1; a-i >= 0 && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вверх
 
    {
 
        if(Board[a-i][b-i])
 
            return false;
 
    }
 
  
    for(int i = 1; a+i < M && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вниз
+
#include <iostream>
    {
+
#include <conio.h>
        if(Board[a+i][b+i])
 
            return false;
 
    }
 
  
    for(int i = 1; a+i < M && b-i >= 0; ++i)///проверка единственности слона по диагонали влево-вниз
+
using namespace std;
    {
 
        if(Board[a+i][b-i])
 
            return false;
 
    }
 
  
    for(int i = 1; a-i >= 0 && b+i < M; ++i)///проверка единственности слона по диагонали вправо-вверх
+
// свободен, занят, ладья, слон, конь, ферзь, король
    {
+
enum type { Free, busy, castle, bishop, knight, queen, king };
        if(Board[a-i][b+i])
 
            return false;
 
    }
 
  
    return true; ///если в ходе проверки слонов и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
/* Chess class */
}
+
class chess
void setEl(int dia, int count) ///функция расстановки слонов; line - очередная строка, count - счетчик количества фигур, которое необходимо расставить
 
 
{
 
{
    ///dia - очередная диагональ, которую нужно исследовать на наличие фигуры и угрозы
+
private:
    int a, b; ///клетка, с которой начинается расстановка, a- очередная строка, b- очередной столбец
+
// Поле данных фигур
 +
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];
 +
}
  
    if (dia < M) ///условие, что клеткa данной диагонали лежат на доске
+
/* Class destructor */
    {
+
~chess( void )
        a = dia; ///начало отсчёта диагоналей, цикл движется по строке
+
{
        b = 0; ///обнуление переменной для столбца, цикл движется по столбцу
+
// Чистка памяти
    }
+
for (int i = 0; i < N; i++)
  else ///если клеткa данной диагонали выходит за размер доски (когда цикл по строке доберется до конца
+
delete[] Field[i];
    {
+
delete[] Field;
        a = M-1; ///самая последняя диагональ
+
}
        b =(dia % M)+1; ///соответственно расчёт переменной для столбца этой диагонали
+
 
    }
+
/* 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
  
    for(int i=0; a-i>=0 && b+i < M; ++i)/// цикл движется по строкам и столбцам снизу слева вправо вверх
+
#endif /*__CHESS_H_ */
    {
 
        int line = a-i; ///строковая координата данной клетки диагонали
 
        int column = b+i; ///столбцовая координата данной клетки диагонали
 
  
        if(tryEl(line, column))/// проверка на единственность слона по диагоналям
+
// END OF 'CHESS.H' FILE
        {
+
</syntaxhighlight>
            Board[line][column]=1; ///установка слона в первую клетку, присваивание ей значения 1 (true)
+
</div>
 +
[http://tm.spbstu.ru/File:T04CHESS.7z Скачать архив]
 +
<br>
  
            for(int i = dia + 1; i<2*M-1; ++i) ///расстановка указанного пользователем количества фигур
 
                setEl(i,count+1);
 
  
            if(count+1 == N) /// если нужное количество фигур поставлено, то
+
'''[[Рубинова Раиса]]'''
                showBoard("E"); /// вызов функции вывода шахматной доски на экран
 
  
            Board[line][column]=0; ///обнуление переменной для установки следующей фигуры в следующую клетку
+
'''Основная идея программы''': программа позволяет выводить на экран всевозможные расстановки n однотипных фигур на шахматной доске размером n*n так, чтобы ни одна из фигур не била другую.
        }
 
    }
 
}
 
  
///Функции проверки и установки для коня
+
Скачать можно  [http://tm.spbstu.ru/File:Mode.rar тут].
  
bool tryHorse(int a, int b) /// проверка на возможность поставить фигуру в данную клетку, a- очередная строка, b- очередной столбец
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
{
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    ///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 5х5 вокруг установленной фигуры
+
#include <iostream>
  
    if ((a-1) >=0 && (b-2)>=0 && Board[a-1][b-2])
+
int S; /// Переменная отвечающая за размер доски.
        return false;
 
  
    if ((a-1)>=0 && (b+2) < M && Board[a-1][b+2])
+
int **B; /// Двумерный массив, отображающий шахматную доску.
        return false;
+
int R = 0; /// Количество решений.
 +
int var, varf, Number,n,l=0; /// Переменные, отвечающие за выбор пользователя и за количество фигур, которые нужно расставить.
  
    if ((a+1) < M && (b-2) >=0 && Board[a+1][b-2])
+
using namespace std;
        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])
+
void NewMas()
        return false;
+
{
 
+
    B = new int *[S];
     if ((a+2) < M && (b-1) >= 0 && Board[a+2][b-1])
+
     for (int i=0; i<S; ++i)
         return false;
+
    {
 
+
        B[i]= new int [S];
    if ((a+2) < M && (b+1) < M && Board[a+2][b+1])
+
    }
         return false;
+
     for (int i=0; i<S; ++i)
 
+
    {
     return true; ///если в ходе проверки коней и угроз не обнаружилось, в данную клетку можно поставить фигуру
+
        for (int k=0; k<S; ++k)
 +
         {
 +
            B[i][k]=0;
 +
         }
 +
     }
 
}
 
}
  
void setHorse(int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count - счетчик количества фигур, которое необходимо расставить
+
void showBoard() /// Функция, которая выводит на экран доску с.
 
{
 
{
     if(count==N) /// если нужное количество фигур поставлено, то
+
     for (int a=0; a<S; ++a)
 
     {
 
     {
         showBoard("H"); /// вызов функции вывода шахматной доски на экран
+
         for (int b=0; b<S; ++b)
 +
        {
 +
            cout << B[a][b] << " ";
 +
        }
 +
        cout << '\n';
 
     }
 
     }
 +
}
  
    if (a == M) ///условие необходимо; прогоняет алгоритм по всем строкам
+
bool checkQ (int a, int b)
        return;
+
{
 
+
     for(int i=0; i<a; ++i)     /// Проверка столбца, в который мы хотим поставить ферзя;
     for (int j=b; j<M; ++j) ///установка коней в первой строке
 
 
     {
 
     {
         if(tryHorse(a, j)) ///проверка данной клетки на возможность установки фигуры
+
         if(B[i][b])
 
         {
 
         {
             Board[a][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
+
             return false;
            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=1; i<=a&&b-i>=0; ++i)     /// Проверка диагонали влево-вверх;
     for(int i=a+1; i<M; ++i) ///дальнейшее заполнение оставшихся строк
 
 
     {
 
     {
         for (int j=0; j<M; ++j)
+
         if(B[a-i][b-i])
 
         {
 
         {
             if(tryHorse(i, j)) ///проверка данной клетки на возможность установки фигуры
+
             return false;
            {
 
                Board[i][j]=1; ///установка коня в первую клетку, присваивание ей значения 1 (true)
 
                int line = i, b = j+1; ///смещение в строке на одну позицию вправо
 
 
 
                if (b == M) ///если данный столбец - самый крайний
 
                {
 
                    b = 0;
 
                    line++;  ///то переход на следующую строку и дальнейшее ее заполнение
 
                }
 
                setHorse(count+1,line,b); ///установка фигуры, увеличение счетчика
 
                Board[i][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
 
            }
 
 
         }
 
         }
 
     }
 
     }
}
 
  
///для короля
+
    for(int i=1; i<=a&&b+i<S; i++)      /// Проверка диагонали вправо-вверх;
 +
    {
 +
        if(B[a-i][b+i])
 +
        {
 +
            return false;
 +
        }
 +
    }
 +
    return true;
 +
}
  
bool tryKing(int a, int b) /// проверка на возможность поставить фигуру в квадрате 3х3, a- очередная строка, b- очередной столбец
+
bool checkR (int a, int b)
 
{
 
{
///проверка на наличие фигур и угроз во всех 8 точках, которые могут быть под ударом в квадрате 3х3 вокруг установленной фигуры
+
     for(int i=0; i<a; ++i)     /// Проверка столбца, в который мы хотим поставить ладью;
 
 
     for(int i = a-1; i <= a+1; ++i) ///проверка по строкам
 
 
     {
 
     {
         for(int j = b-1; j <= b+1; ++j) ///проверка по столбцам
+
         if(B[i][b])
 
         {
 
         {
             if (a>=0 && a < M && b>=0 && b < M && Board[a][b]) ///условие наличия клетки в пределах доски
+
             return false;
                return false;
 
 
 
            if ((a+1) < M && (b-1) >=0 && Board[a+1][b-1])
 
                return false;
 
 
 
            if ((a+1) < M && Board[a+1][b])
 
                return false;
 
 
 
            if ((a+1) < M && (b+1) < M && Board[a+1][b+1])
 
                return false;
 
 
 
            if ((b+1) < M && Board[a][b+1])
 
                return false;
 
 
 
            if ((a-1)>=0 && (b+1) < M && Board[a-1][b+1])
 
                return false;
 
 
 
            if ((a-1) >=0 && Board[a-1][b])
 
                return false;
 
 
 
            if ((a-1) >=0 && (b-1)>=0 && Board[a-1][b-1])
 
                return false;
 
 
 
            if ((b-1) >= 0 && Board[a][b-1])
 
                return false;
 
 
         }
 
         }
 
     }
 
     }
 
+
     return true;
     return true; ///если в ходе проверки королей и угроз не обнаружилось, в данную клетку можно поставить фигуру
 
 
}
 
}
  
void setKing (int count, int a, int b) ///функция расстановки коней; a - очередная строка, b - очередной столбец, count -  счетчик количества фигур, которое необходимо расставить
+
bool checkE (int a, int b)
 
{
 
{
     for (int j=b; j<M; ++j) ///установка королей в первой строке
+
     for(int i=1; i<=a&&b-i>=0; ++i)     /// Проверка диагонали влево-вверх;
 
     {
 
     {
         if(tryKing(a, j)) ///проверка данной клетки на возможность установки фигуры
+
         if(B[a-i][b-i])
 
         {
 
         {
             Board[a][j]=1; ///проверка данной клетки на возможность установки фигуры
+
             return false;
            setKing(count+1,a,j); ///расстановка фигур в первой строке
 
            Board[a][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
 
 
         }
 
         }
 
     }
 
     }
  
     for(int i=a+1; i<M; ++i) ///установка фигур в оставшуюся часть шахматной доски по строкам
+
     for(int i=1; i<=a&&b+i<S; i++)       /// Проверка диагонали вправо-вверх;
 
     {
 
     {
         for (int j=0; j<M; ++j)
+
         if(B[a-i][b+i])
 
         {
 
         {
             if(tryKing(i, j)) ///проверка данной клетки на возможность установки фигуры
+
             return false;
            {
 
                Board[i][j]=1; ///проверка данной клетки на возможность установки фигуры
 
                setKing(count+1,i,j); ///расстановка фигур
 
                Board[i][j]=0;  ///обнуление переменной для установки следующей фигуры в следующую клетку
 
            }
 
 
         }
 
         }
 
     }
 
     }
 +
    return true;
 +
}
  
     if(count==N) /// если нужное количество фигур поставлено, то
+
bool checkH (int a, int b)
 +
{
 +
if (((b+2)<S)&&((a+1)<S)&&(B[a+1][b+2]))
 +
    {
 +
        return false;
 +
    }
 +
if (((b-2)>=0)&&((a+1)<S)&&(B[a+1][b-2]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-1)>=0)&&((b+2)<S)&&(B[a-1][b+2]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-1)>=0)&&((b-2)>=0)&&(B[a-1][b-2]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a+2)<S)&&((b+1)<S)&&(B[a+2][b+1]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a+2)<S)&&((b-1)>=0)&&(B[a+2][b-1]))
 +
    {
 +
        return false;
 +
     }
 +
if (((a-2)>=0)&&((b+1)<S)&&(B[a-2][b+1]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-2)>=0)&&((b-1)>=0)&&(B[a-2][b-1]))
 
     {
 
     {
        showBoard("K");/// вызов функции вывода шахматной доски на экран
+
         return false;
         return;
 
 
     }
 
     }
 +
        return true;
 
}
 
}
  
int main()
+
bool checkK (int a, int b)
 
{
 
{
     char s; ///переменная, будет использована в цикле
+
     if (((a+1)<S)&&((b+1)<S)&&(B[a+1][b+1]))
    do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
 
 
     {
 
     {
         do ///цикл для считывания введенного пользователем размера доски
+
         return false;
         {
+
    }
            cout << "Input the size of the board: " << endl; ///ввод размера доски
+
if (((a+1)<S)&&(B[a+1][b]))
            cin >> M;
+
    {
 +
         return false;
 +
    }
 +
if (((a+1)<S)&&((b-1)>=0)&&(B[a+1][b-1]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-1)>=0)&&((b-1)>=0)&&(B[a-1][b-1]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-1)>=0)&&((b+1)<S)&&(B[a-1][b+1]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-1)>=0)&& (B[a-1][b]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a+1)<S)&&(B[a][b+1]))
 +
    {
 +
        return false;
 +
    }
 +
if (((a-1)>=0)&&(B[a][b-1]))
 +
    {
 +
        return false;
 +
    }
 +
        return true;
 +
}
  
            if ( (M%2) == 1) ///цикл, работающий только в том случае, если пользователь введет нечетное число
 
            {
 
                cout << '\n' << "The number must be even, so try to input the size again" << '\n' << endl;
 
            }
 
  
 +
void Queen(int a) /// a - номер очередной строки в которую нужно поставить очередного ферзя.
 +
{
 +
    if(a==S)
 +
    {
 +
        showBoard();
 +
        std::cout << ++R << "\n\n";
 +
        return;
 +
    }
 +
    for(int i=0; i<Number; ++i)
 +
    {
 +
        if(checkQ(a, i))
 +
        {
 +
            B[a][i] = 1;
 +
            Queen(a+1);
 +
            B[a][i] = 0;
 
         }
 
         }
        while (M%2 !=0); ///пока пользователь не введет допуcтимое число, цикл не прерывается
+
    }
 +
    return;
 +
}
  
         Board = new int*[M]; ///создание двумерного массива для отображения шахматной доски
+
void Rook (int a)
         for (int i = 0; i<M; i++)
+
{
             Board[i] = new int[M]; ///создание первую строку доски
+
    if(a==S)
        for (int i = 0; i<M; i++)
+
    {
             for (int j = 0; j<M; j++)
+
        showBoard();
                Board[i][j] = 0; ///зануление массива
+
         std::cout << ++R << "\n\n";
 +
         return;
 +
    }
 +
    for(int i=0; i<Number; ++i)
 +
    {
 +
        if(checkR(a, i))
 +
        {
 +
             B[a][i] = 1;
 +
             Rook(a+1);
 +
            B[a][i] = 0;
 +
        }
 +
    }
 +
    return;
 +
}
  
         int V; ///пользователь выбирает один из двух вариантов работы программы
+
void Elephant (int a)
         cout << '\n' << "Input your choice: 1=placing of figures, 2=for max amount of figures" << endl;
+
{
         cin >> V;
+
    if(a==S)
 +
    {
 +
         showBoard();
 +
         std::cout << ++R << "\n\n";
 +
        return;
 +
    }
 +
    for(int i=0; i<Number; ++i)
 +
    {
 +
        if(checkE(a, i))
 +
        {
 +
            B[a][i] = 1;
 +
            Elephant(a+1);
 +
            B[a][i] = 0;
 +
         }
 +
    }
 +
    return;
 +
}
  
        if (V==1) ///цикл, расставляющий фигуры по введенным пользователем данным
+
void Horse (int a, int i)
 +
{
 +
    if(a==S)
 +
    {
 +
        showBoard();
 +
        std::cout << ++R << "\n\n";
 +
        return;
 +
    }
 +
    for(int i=0; i<Number; ++i)
 +
    {
 +
        if(checkH(a, i))
 
         {
 
         {
             char k; ///переменная, будет использована в цикле
+
             B[a][i] = 1;
             do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
+
             Horse(a+1, i);
             {
+
             B[a][i] = 0;
                int T; ///пользователь выбирает фигуру
+
        }
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
+
    }
                cin >> T;
+
    return;
 +
}
  
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
+
void King (int a, int i)
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
+
{
                {
+
    if(i==S)
                    maximum=M;
+
    {
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
        showBoard();
                }
+
        std::cout << ++R << "\n\n";
                if (T==2) ///максимальное количество фигур на заданной доске для короля
+
        return;
                {
+
    }
                    maximum=0.25*M*M;
+
    if(a==S)
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
    {
                }
+
        showBoard();
                if (T==3) ///максимальное количество фигур на заданной доске для коня
+
        std::cout << ++R << "\n\n";
                {
+
        return;
                    maximum=0.5*M*M;
+
    }
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
    for(int a=0; a<Number; ++a)
                }
+
    {
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
+
        if(checkK(a, i))
                {
+
        {
                    maximum=M;
+
            B[a][i] = 1;
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
            King(a, i+1);
                }
+
            B[a][i] = 0;
                if (T==5) ///максимальное количество фигур на заданной доске для слона
+
        }
                {
+
    }
                    maximum=2*M-2;
+
    return;
                    cout << '\n' << "Max amount of figures for this board = " << maximum << '\n' << endl;
+
}
                }
+
int main()
 +
{
 +
    cout << "Welcome! Enter the size of the board" << endl;
 +
    cin >> S;
 +
    NewMas();
 +
    cout << "What do you want to do: see all variants for max number (enter 1) or for your number (enter 2)" << endl;
 +
    cin >> var;
 +
    cout << "Choose the figure (1-queen; 2-rook; 3-elephant; 4-horse; 5-king)" << endl;
 +
    cin >> varf;
 +
    if ((var==1)&&(varf==1))
 +
    {
 +
        Number=S;
 +
        Queen(0);
 +
        return 0;
 +
    }
 +
    if ((var==1)&&(varf==2))
 +
    {
 +
        Number=S;
 +
        Rook(0);
 +
        return 0;
 +
    }
 +
    if ((var==1)&&(varf==3))
 +
    {
 +
        Number=S;
 +
        Elephant(0);
 +
        return 0;
 +
    }
 +
    if ((var==1)&&(varf==4))
 +
    {
 +
        Number=S;
 +
        Horse(0,0);
 +
        return 0;
 +
    }
 +
    if ((var==1)&&(varf==5))
 +
    {
 +
        Number=S;
 +
        King(0,0);
 +
        return 0;
 +
    }
 +
    if (var==2)
 +
    {
 +
        cout << "Enter the number of figures" << endl;
 +
        cin >> n;
 +
        if (varf==1)
 +
        {
 +
            Number=n;
 +
            Queen(0);
 +
            //if (i==n) {showBoard();}
 +
            return 0;
 +
        }
 +
        if (varf==2)
 +
        {
 +
            Number=n;
 +
            Rook(0);
 +
            return 0;
 +
        }
 +
        if (varf==3)
 +
        {
 +
            Number=n;
 +
            Elephant(0);
 +
            return 0;
 +
        }
 +
        if (varf==4)
 +
        {
 +
            Number=n;
 +
            Horse(0,0);
 +
            return 0;
 +
        }
 +
        if (varf==5)
 +
        {
 +
            Number=n;
 +
            King(0,0);
 +
            return 0;
 +
        }
 +
    }
 +
    return 0;
 +
}
 +
 
 +
 
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
 
 +
'''[[Уманский Александр]]'''
  
                do ///цикл, считывающий количество фигур, заданное пользователем
+
'''Работа программы''': Программа предлагает 2 режима работы 1 режим это нахождение для 1 из 5 фигур таких расстановок L фигур, на доске M*N, что они не бьют друг друга, второй режим возможно найти максимальное число фигур, которое можно расставить на этом поле, чтобы они не били друг друга.
                {
 
                    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;
+
'''Идея алгоритма''': Основная идея заключается в присваиванию клетке 1 из 3 значений, пустая клетка, битая клетка или клетка, в которой стоит фигура.
 +
В точку ставится фигура, дальше маркируются поля, в которые уже невозможно поставить фигуру, затем мы ставим следующую фигуру и снова маркируем поля, в которые не можем ничего поставить и так далее до нужного пользователю числа фигур. Поиск максимального числа это попытка поставить на доску как можно больше фигур, он пользуется алгоритмами первого пункта.
  
                if (T==1) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для ферзя
+
Скачать можно  [http://mech.spbstu.ru/File:Ch.rar тут].
                {
+
 
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
+
 
                    for (int i=0; i <M; ++i)
+
 
                        setQueen(i,0);
+
'''[[Капитанюк Светлана]]'''
                }
+
 
                if (T==2) ///цикл, вызывающий на экран все варианты расстановки заданного пользователем числа фигур для короля
+
'''Краткое описание алгоритма''': Доска представлена в виде динамического массива. Если в клетке присутствует фигура, то тогада она обозначается '+', если же клетка осталась путсая, то тогда '0'.
                {
+
 
                    result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
+
'''Инструкция''': пользователь вводит размер доски, далее он выбирает то действие, которое он хотел бы выполнить: посчитать максимальное число возможных фигур на данной доске, или же расставить фигуры так, чтобы они не били друг друга.
                    setKing(0,0,0);
+
 
                }
+
Скачать можно  [http://tm.spbstu.ru/File:Chess_03.zip тут].
                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;
+
'''[[Демченко Артём]]'''
                cin >> k;
 
            }
 
            while (k != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
 
        }
 
  
        else if (V==2) ///цикл, вычисляющий максимальное количество фигур по введенным пользователем данным
+
'''Основная идея программы''': Программа подсчитывает и выводит расстановку указанного кол-ва фигур на указанном поле и второй опицей выводит максимальную расстановку на поле размером size*size.
        {
+
 
            char z; ///переменная, будет использована в цикле
+
'''Инструкция''': Запустите программу и следуйте инструкциям. Сначала идет выбор алгоритма, после чего идет выбор фигуры и размер доски для подсчета максимальной расстановки на поле size*size. Результат будет выведен на экран.
            do      /// цикл, выводящий на экран данные в зависимости от введенных пользователем значений переменных
+
 
            {
+
Скачать можно [http://tm.spbstu.ru/File:Chessss.zip тут].
                int T; ///переменная для выбора фигуры пользователем
+
 
                cout << '\n' << "Input type of figure: 1-queen, 2-king, 3-horse, 4-rook, 5-elephant"<< endl;
+
'''[[Гильманов Илья]]'''
                cin >> T;
+
 
                char d;  ///переменная, будет использована в циклах
+
'''Основная идея программы''': пользователь вводит размер доски MxM , тип фигур, их количество. Программа рассчитывает максимально возможное количество фигур , которые можно расположить на доске, чтобы они не били друг друга.
                int maximum; ///переменная, хранящая максимальное количество фигур, которое можно расставить на заданной доске
+
 
                if (T==1) ///максимальное количество фигур на заданной доске для ферзя
+
'''Инструкция к программе''': Пользователь вводит размер доски M(size*size).А затем предоставляется выбор между нахождением максимально возможного числа фигур , и их расстановкой.Также пользователь выбирает тип фигуры , и количество(если интересует расстановка).
                {
+
 
                    maximum=M; ///формула расчёта максимального количества фигур для заданной доски
+
Скачать можно [http://mech.spbstu.ru/File:CheEeeSss.rar здесь]
                    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);
 
                    }
 
  
                }
+
'''Основная идея программы''': реализация задачи о расстановке фигур одинакового типа на произвольной доске MxM
                if (T==2) ///максимальное количество фигур на заданной доске для короля
+
Скачать можно [http://mech.spbstu.ru/File:main.rar здесь]
                {
 
                    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;
 
                    cin >> d;
 
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 
                    {
 
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        setKing(0,0,0);
 
                    }
 
                }
 
                if (T==3) ///максимальное количество фигур на заданной доске для коня
 
                {
 
                    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;
 
                    cin >> d;
 
                    cout << '\n' << "All possible variants for this amount of figures on this board:" << '\n' << endl;
 
                    if (d=='+') ///по выбору пользователя вывод всех возможных расстановок для максимального количества для данной фигуры
 
                    {
 
                        result_count=0; ///обнуление переменной, выводящей номер решения; необходимо при повторной работе цикла
 
                        N=maximum; ///приравниваем количество фигур для установки максимально возможному, рассчитанному по формуле выше
 
                        setHorse(0,0,0);
 
                    }
 
                }
 
                if (T==4) ///максимальное количество фигур на заданной доске для ладьи
 
                {
 
                    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)
 
                            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;
+
Инструкция:
            }
+
Вводите необходимые данные(кол-во строк, столбцов, фигуры, тип расстановки) согласно последовательности выполнения программы
            while (z != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение
+
Краткое описание алгоритма:
        }
+
1)Выделяет память под доску(динамическая матрица)
        cout << '\n' << "If you want to change the size of board, input +, if not, input -" << endl;
+
2)Устанавливает каждую следующую фигуру на n-е свободное место которое он нашел после последней установленной фигуры, где n изменяется от 1 до бесконечности(установка заканчивается тогда, когда программа не может установить очередную фигуру).
        cin >> s;
+
3)Счетчик количества фигур, которые необходимо установить, уменьшается на 1 после каждой установки.
        if (s=='-')
+
4)После того, как фигура установлена, программа рекурсивно вызывает функцию установки очередной фигуры(возвращается в пункт 2)
        {
+
5)В рекурсивную функцию отправляется только копия доски. Таким образом, возвращаясь из рекурсии, мы получаем доску без последующих установленных фигур. Когда счетчик фигур, которые необходимо установить, уменьшается до нуля, данное поле сохраняется в списке.
            cout << '\n' << "The program is finished." << '\n' << endl; ///вывод на экран сообщения о завершении работы программы
+
6)Вывод списка.
        }
+
Скачать можно [http://tm.spbstu.ru/File:Шахматы.zip тут]
    }
 
    while (s != '-'); ///цикл работает до тех пор, пока пользователь не даст команду на его завершение, а также на завершение всей программы
 
}
 
 
 
</syntaxhighlight>
 
</div>
 
 
 
'''[[Уманский Александр]]'''
 
 
 
'''Работа программы''': Программа предлагает 2 режима работы 1 режим это нахождение для 1 из 5 фигур таких расстановок L фигур, на доске M*N, что они не бьют друг друга, второй режим возможно найти максимальное число фигур, которое можно расставить на этом поле, чтобы они не били друг друга.
 
 
 
'''Идея алгоритма''': Основная идея заключается в присваиванию клетке 1 из 3 значений, пустая клетка, битая клетка или клетка, в которой стоит фигура.
 
В точку ставится фигура, дальше маркируются поля, в которые уже невозможно поставить фигуру, затем мы ставим следующую фигуру и снова маркируем поля, в которые не можем ничего поставить и так далее до нужного пользователю числа фигур. Поиск максимального числа это попытка поставить на доску как можно больше фигур, он пользуется алгоритмами первого пункта.
 
 
 
Скачать можно [http://mech.spbstu.ru/File:Ch.rar тут].
 
Вам запрещено изменять защиту статьи. 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:

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