Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
13 / 13 / 2
Регистрация: 17.05.2012
Сообщений: 121
1

Восемь ферзей

13.11.2012, 22:37. Показов 511. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как известно, моя цель - расставить 8 ферзей на столе таким образом, чтобы ни один не попадал под удар. В учебнике Дейтела предлагается такой метод: сначала мы вычисляем значение каждой ячейки, которое равно тому, сколько клеток попадает под удар, если на нее поставить ферзя. А потом заполняем поле ферзями ставя каждый новый на клетку с наименьшим значением, учитывая, чтобы она не оказывалась уже под ударом.
Но метод паршивый, либо мой код паршивый, либо я втупил, так как получается расположить лишь шесть ферзей. Мне очень не нравится мой код из-за двух громоздких функций, но я ничего не могу поделать пока...
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
 
using namespace std;
 
void exceptSquaresValue (int[][8]);
void exceptSquares (int[][8], int, int);
 
int main()
{
    int board[8][8] = { 0 }; //new array which will be filled while new figures appearing on the board;
    int squares[8][8] = { 0 }; //calculates danger value of each square;
 
    exceptSquaresValue (squares); //after functions do its work, it returns maximal value
 
    for (int n = 1; n <= 8; n++)
    {
        int min = 64;
        int x,y;
 
        for (int i = 0; i <= 7; i++)
        {
            for (int j = 0; j <= 7; j++)
            {
                if (squares[j][i] < min && board[j][i] == 0)
                {
                    min = squares[j][i];
                    x = j;
                    y = i;
                }
            }
        }
 
        board[x][y] = 1;
        exceptSquares (board, x, y);
 
        cout << n << ")  " << x << "-" << y << endl;
    }
 
    system("pause");
    return 0;
}
 
void exceptSquaresValue (int squares[][8]) // calculates value for each square, how many squares wull being struck after queen is placed on it
{
    int row, column;
 
    for (int i = 0; i <= 7; i++)
    {
        for (int j = 0; j <= 7; j++)
        {
            row = i;
            column = j;
 
            //main diagonal
            while (row < 7 && column < 7)
            {
                ++squares[j][i];
                row++;
                column++;
            }
 
            row = i;
            column = j;
 
            while (row > 0 && column > 0)
            {
                ++squares[j][i];
                row--;
                column--;
            }
 
            row = i;
            column = j;
 
            //minor diagonal
            while (row < 7 && column > 0)
            {
                ++squares[j][i];
                row++;
                column--;
            }
 
            row = i;
            column = j;
 
            while (row > 0 && column < 7)
            {
                ++squares[j][i];
                row--;
                column++;
            }
 
            squares[j][i] += 15; // adding all squares in column and row
        }
    }
}
 
void exceptSquares (int board[][8], int x, int y) // when queen places certain square, we must except all squares, where other queens cannot be placed
{
    int row = y;
    int column = x;
 
    for (int i = 0; i <= 7; i++) // excepting row and columns
    {
        board[column][i] = 1;
        board[i][row] = 1;
    }
 
    // main diagonal
    while (row < 7 && column < 7) 
        board[column++][row++] = 1;
 
    row = x;
    column = y;
 
    while (row > 0 && column > 0)
        board[column--][row--] = 1;
 
    row = x;
    column = y;
 
    //minor diagonal
    while (row < 7 && column > 0)
        board[column--][row++] = 1;
 
    row = x;
    column = y;
 
    while (row > 0 && column < 7)
        board[column++][row--] = 1;
}
Извините за комментарии на английском, пытаюсь писать на нем как могу, надо же учиться
Миниатюры
Восемь ферзей  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2012, 22:37
Ответы с готовыми решениями:

восемь ферзей на билдере
Нужно переделать из консольного текста в С++ builder ( то есть с модулями, интерфейсом) Задача о...

Разделение pi на восемь частей
Хочу чтобы оно считало угол в радианах...ну то есть pi/8;2pi/8 и т д.не понимаю почему столько...

8 ферзей
Здравствуйте. Пыталась реализовать задачу о 8 ферзях. Программа написана на С++. В принципе задача...

Что значит отобразить преобразованные элементы по восемь слов на строку? Vector
Здравствуйте. Пытаюсь перевести символы вектора(каждого элемента) в верхний регистр(может...

0
13.11.2012, 22:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2012, 22:37
Помогаю со студенческими работами здесь

Расстановка 8 ферзей
Привет всем, слушайте, вот исходник на С++ задача &lt;&lt;о восьми ферзях&gt;&gt;: #include&lt;iostream&gt;...

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

Обработать вектор, отобразив элементы по восемь слов на строку, перевести символы элементов в верхний регистр
Здравствуйте. Такая задача: Прочитайте последовательность слов из потока cin и сохраните их в...

Расстановка ферзей на шахматной доске
Найти на кубической доске всевозможные расстановки 15 ферзей так, чтобы они не били друг друга

Переделать программу для n ферзей
Помогите переделать программу, чтобы можно было задать количество ферзей пользователю....

Перебор. Задача про ферзей.
На шахматной доске требуется расставить 8 ферзей, что бы ни один ферзь не атаковал другого....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru