0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 55
1

Поясните смысл кода. Вроде бы все понятно, но как ставятся по итогу ферзи не ясно

23.05.2019, 14:52. Показов 350. Ответов 5
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
for (int j = 0; j < 8; j++) // проверка 8-ми строк
            {
                if (board[i, j] == 0) 
                {
                    setqueen(i, j);
                    if (i == 7) 
                    {
                        result = true;
                    }
                    else
                    {
                        if (!(result = tryqueen(i + 1)))// этот момент
                            deletequeen(i, j);
 
                    }
                }
                if (result)
                    break;
                count++;
            }
public void setqueen(int i, int j)//заполняет ячейки, которые королева бьет
        {
            for (int k = 0; k < 8; k++)
            {
                ++board[k, j];// этот момент
                ++board[i, k];// этот момент
                int diag;
                diag = j - i + k;
                if (diag >= 0 && diag < 8)// этот момент
                {
                    ++board[k, diag];
                }
                diag = j + i - k;
                if (diag >= 0 && diag < 8)// этот момент
                {
                    ++board[k, diag];
                }
            }
            board[i, j] = 1; // стоит ферзь
            
        }
        public void deletequeen(int i, int j)
        {
            for (int k = 0; k < 8; k++)
            {
                --board[k, j];// этот момент
                --board[i, k];// этот момент
                int diag;
                diag = j - i + k;
                if (diag >= 0 && diag < 8)//этот момент
                {
                    --board[k, diag];
                }
                diag = j + i - k;
                if (diag >= 0 && diag < 8)//этот момент
                {
                    --board[k, diag];
                }
            }
            board[i, j] = 0;
        }
 
[size="1"][color="grey"][I]Добавлено через 12 минут[/I][/color][/size]
Еще назрел вопрос, почему эта функция булевская?
 
 bool tryqueen(int i) //попытка поставить королеву на i столбец
        {
            bool result = false;
            if (chekfirst == true)
            {
                Random rand = new Random();
 
                setqueen(i-1, rand.Next(1, 9) - 1);
                chekfirst = false;
 
            }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2019, 14:52
Ответы с готовыми решениями:

Подскажите книгу по Matlab, где все ясно и понятно)
Подскажите книгу по Matlab, где все ясно и понятно)

Вроде всё понятно, Ан нет!( 'Program.zarplata' does not contain a constructor that takes 3 arguments)
using System; using System.IO; using System.Linq; using System.Collections.Generic; namespace...

Вроде ничего и не удалял, а по итогу: Fatal error: Call to a member function access()
Решил сайтик себе подправить вроде ничего и не удалял, только перезалил пару модулей и темку....

Кривое отображение. Вроде ясно, а исправить незнаю
хидер почему-то расположен таким высоким. Не знаю как исправить ошибку голову сломал. Помогите...

5
113 / 78 / 42
Регистрация: 14.12.2015
Сообщений: 945
23.05.2019, 16:53 2
Про поводу ++board почитайте про инкремент и декремент.
C#
1
if (diag >= 0 && diag < 8)
Если diag больше или равно 0 И diag меньше 8, то
C#
1
++board[k, diag];
0
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 55
23.05.2019, 17:51  [ТС] 3
Здесь я разобрался. Остался вопрос почему функция булевская

Добавлено через 56 минут
И как расшифровать 12-ую строку
0
1055 / 862 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.05.2019, 19:10 4
этот момент вообще должен вызывать компиляторную ошибку.
C#
1
if (!(result = tryqueen(i + 1)))
Что тут твориться - а фиг его поймешь.
tryqueen - я не вижу чтоб метод вообще возвращал значение.
В общих чертах клетки доски получают значение 1, если на клетке стоит королева, или клетка под боем королевы.
C#
1
2
3
//это отмечаются поля по  горизонтали и по вертикали от ферзя
                ++board[k, j];// этот момент
                ++board[i, k];// этот момент
Мой совет - выбросить этот алгоритм.
Во-первых клетки боя очень затратно отмечать.
Во-вторых тут вообще доска не нужна и не нужны поля.
В-третьих тут более эффективный рекурсивный метод а не итерационный.

Вот алгоритм:
1) Создаем стек для ферзей.
2) Создаем методы проверки чтоб ферзи не били друг друга
2.1 и 2.2) если совпадает одна из координат - ошибка
2.3 и 2.4) если сумма или разница координат совпадает - ошибка
3) Метод принимает стек ферзей и текущую строку, возвращает истину или ложь
3.1) Метод в качестве параметра получил строку, идем по значениям от 0 до 7.
3.1.1) Делаем четыре проверки с каждым из ферзей. Если нет ферзей тоже успех
Успешная проверка - помещаем полученного ферзя в стек
3.2.0) если индекс строки 7 то return true
3.2) Запускаем метод 3, передав ему строку на 1 больше.
3.2.1) Если метод вернул истину, то все ферзи на месте, делаем return true;
3.2.2) Если метод вернул ложь, то извлекаем из стека этого ферзя и идем дальше по циклу
3.3) Если цикл по столбцам завершился, то значит нет возможности поставить ферзя. return false
0
0 / 0 / 0
Регистрация: 02.10.2018
Сообщений: 55
23.05.2019, 19:15  [ТС] 5
Она возвращает, это моя ошибка. Неверно скопировал сюда.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
bool tryqueen(int i) //попытка поставить королеву на i столбец
        {
            bool result = false;
            if (chekfirst == true)
            {
                Random rand = new Random();
 
                setqueen(i-1, rand.Next(1, 9) - 1);
                chekfirst = false;
 
            }
            for (int j = 0; j < 8; j++) // проверка 8-ми строк
            {
                if (board[i, j] == 0) // ячейку никто не бьет и можно ставить королеву
                {
                    setqueen(i, j);
                    if (i == 7) // значит всех королев поставили
                    {
                        result = true;
                    }
                    else
                    {
                        if (!(result = tryqueen(i + 1)))
                            deletequeen(i, j); // убирает ферзя с доски
 
                    }
                }
                if (result)
                    break;
                count++;
            }
            return result;
        }
Добавлено через 2 минуты
Доска мне нужна для визуального отображения расстановки
0
1055 / 862 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.05.2019, 19:29 6
Еще лайфак.
На 3.2.0 можно вывести или сохранить результат, извлечь последнего ферзя и продолжить цикл.
Тогда программа найдет ВСЕ возможные решения задачи о ферзях.

Добавлено через 9 минут
Ага, все-таки тут у тебя рекурсивный алгоритм )))

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

Добавлено через 5 минут
Цитата Сообщение от DayZzZ Посмотреть сообщение
Доска мне нужна для визуального отображения расстановки
Хм, не представляю как ты вообще в результате разберешься, ибо у тебя вся(или почти вся) доска будет заполнена единицами
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2019, 19:29

Подскажите пожалуйста какую-нибудь книгу в которой ясно и понятно описана работа со строками в С++
Подскажите пожалуйста какую-нибудь книгу в которой ясно и понятно описана работа со строками в С++.

Пролог-Ферзи-Выполнить задание, опираясь на программу ферзи
С помощью предиката ферзи - uazirler (queens) 3-х аргументов, найдите все правильные расстановки...

После установки в VS2010 вроде бы все есть, кроме нумерации строк кода.
После установки в VS2010 вроде бы все есть, кроме нумерации строк кода, подскажите их можно...

Поясните смысл задания
Доброго времени суток. Есть задание: &quot;Равносильность доказать или опровергнуть, не используя...

Поясните смысл фразы
А что будет выбираться, если &lt;ds:Reference URI=&quot;&quot;&gt;

Поясните смысл записи
Приветствую всех! Есть база данных доски объявлений, в таблице категорий есть столбец с такими...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.