Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задача о 8 ферзях

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Sarge1978



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На сайте algolist.manual.ru есть алгоритм классической расстановки 8 ферзей на шахматной доске. Он запрограммирован в Паскале. Вчера попробовал переписать это на С.
Вот что получилось:

Код:
 
#include <iostream.h>
#include <math.h>
 
const int Num = 8;    //Количество ферзей.
int pos[Num];        
int count = 0;        //Количество решений.
 
int IsRight(int pos[], int k, int y)
{
    int i = 1;
 
    while ((i < k) && (y != pos[i-1]) && (abs(k-i) != abs(y-pos[i-1])))
    {
        ++i;
    }
        
    if (i == k)  
        return 1;
    else  
        return 0;
}
 
void FoundPer(int k)
{    
    for (int y = 1; y <= Num; ++y)
    {
        if (IsRight(pos, k, y))
        {
            pos[k-1] = y;
 
            if (k == Num)
            {
                for (int i = 1; i <= Num; ++i)
                {
                    cout << pos[i-1] << " ";                    
                }
                cout << "\n";
                ++count;
            }
            FoundPer(k+1);
        }
    }
}
 
void main()
{
    cout<< "Permutations of " << Num << " queens.\n\n";
    
    FoundPer(1);
 
    cout<< "There are " << count << " permutations\n\n";
}
 

 
Собственно, вопрос. Не совсем понял что делает конструкция:

Код:
(i < k) && (y != pos[i-1]) && (abs(k-i) != abs(y-pos[i-1]))
.
Объясните, пожалуйста, подробнее.

Всего записей: 134 | Зарегистр. 12-03-2005 | Отправлено: 09:59 07-10-2005
Kuvaldum



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Объясняю с максимальной подробностью
 
Итак:  

Код:
 (i < k) && (y != pos[i-1]) && (abs(k-i) != abs(y-pos[i-1]))

Условие цикла, в котором проверяется возможность постановки ферзя в очередной горизонтали доски.  
 
Переменные:
i - номер очередного проверяемого ферзя из уже расставленных, изменяется от 1 до k-1;
k - номер горизонтали, куда ставим очередного ферзя (соответственно, k-1 - количество уже расставленных ферзей);
y - вертикаль, куда пытаемся поставить ферзя;
pos[] - массив, хранящий вертикали уже расставленных ферзей для каждой горизонтали.
 
 
Условие состоит из трех кусочков, каждый из которых должен быть выполнен:

Код:
 (i < k)

Это очевидное условие - перебраны все ферзи, ни один нас не бъет.

Код:
(y != pos[i-1])

Это проверка, что ферзь не стоит в той же вертикали доски. Отнимание единицы здесь связано с тем, что авторы программы пронумеровали все, начиная с единицы, а массивы в С индексируются с нуля.

Код:
(abs(k-i) != abs(y-pos[i-1]))

Наименее очевидная проверка, но если вдуматься, все прозрачна. Логически здесь проверяется, не бьет ли нас текущий ферзь по диагонали. Фактически проверяется, что до него совпадают расстояния по горизонтали и вертикали. abs() - модуль, абсолютное значение, проставлено чтобы одновременно проверить оба диагональных направления.
 
Достаточно подробно ?

Всего записей: 169 | Зарегистр. 31-01-2005 | Отправлено: 17:04 08-10-2005
Sarge1978



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2 Kuvaldum
Да, огромное спасибо! Хоть что-то понятно стало
Это, между прочим, единственный внятный ответ, который я услышал.
Ещё раз, спасибо.

Всего записей: 134 | Зарегистр. 12-03-2005 | Отправлено: 12:01 09-10-2005
vadimzrn

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
О я на бейсике эту задачу решал... было время...
92 позиции должно быть...
кстати 10 строк была программка

Всего записей: 2 | Зарегистр. 02-08-2014 | Отправлено: 19:55 27-02-2016
alexeyz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
10 строк? Должно быть красиво!  Кодом поделитесь ?  

Всего записей: 186 | Зарегистр. 22-10-2002 | Отправлено: 17:35 02-03-2016
DDDK

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ностальджи ))
 
Я на PL/1 делал курсовик по этим ферзям,
на больших ЕС-1035 машинах,
на перфокартах .........
 
Тоже было мало строк кода.......
 
Ээээээ-ххххххххх .............. было время.

Всего записей: 147 | Зарегистр. 07-11-2005 | Отправлено: 15:28 24-03-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Задача о 8 ферзях


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru