Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Сязанно с задачей о 8 ферзях


Автор: Ольга999 7.5.2017, 12:41
Помогите, пожалуйста, написать код или переделать код, который будет считать количество отказов при расстановке  8 ферзей. 
Буду благодарна за помощь.
Спасибо тем, кто откликнется на мою просьбу.

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

Вот код.

Код

#include <iostream>
using namespace std;
const int n = 8;
int board[n][n]; // доска
void setQueen(int i, int j) 
{
    for (int x = 0; x < n; ++x)
    {
        ++board[x][j]; //горизонтали
        ++board[i][x]; //вертикали
        int foo;
        foo = j - i + x; //диагонали
        if (foo >= 0 && foo <n)
            ++board[x][foo];
        foo = j + i - x;//другая диагонали 
        if (foo >= 0 && foo <n)
            ++board[x][foo];
    }
    board[i][j] = -1; //означает стоит ферзь
}

void resetQueen(int i, int j)
{
    for (int x = 0; x < n; ++x)
    {
        --board[x][j];
        --board[i][x];
        int foo;
        foo = j - i + x;
        if (foo >= 0 && foo <n)
            --board[x][foo];
        foo = j + i - x;
        if (foo >= 0 && foo <n)
            --board[x][foo];
    }
    board[i][j] = 0;
}

bool tryQueen(int i) 

{
    bool result = false; // 
    for (int j = 0; j < n; ++j)    {
        if (board[i][j] == 0) // если ячейка, которою проверяем = 0, то можно ставить королеву
        {
            setQueen(i, j); 
            if (i == n - 1) // если столбец равен 7, то всех королев поставили 
                result = true;
            else  // иначе пробуем поставить ферзя на следующий столбец
            {
                if (!(result = tryQueen(i + 1))) // если не удалось поставить в столбец ферзя
                    resetQueen(i, j);  // убираем ферзя с позиции [i][j]
            }
        }
        if (result) 
    break;    
}
    return result;
}



int main()
{
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            board[i][j] = 0; 
    tryQueen(0);
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (board[i][j] == -1)
                cout << "[F]";
            else
                cout << " * ";
        }
        cout << endl;
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)