С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
strange_man
10 / 10 / 0
Регистрация: 17.05.2012
Сообщений: 118
#1

Восемь ферзей - C++

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

Как известно, моя цель - расставить 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
Миниатюры
Восемь ферзей  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Восемь ферзей (C++):

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

Разделение pi на восемь частей - C++
Хочу чтобы оно считало угол в радианах...ну то есть pi/8;2pi/8 и т д.не понимаю почему столько мусора выдает. #include &lt;stdio.h&gt; ...

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

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

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 22:37
Привет! Вот еще темы с ответами:

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

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

Расставить 8 Ферзей на шахмотной доске... в борланд С - C++
Расставить 8 ферзей на шахматной доске, чтобы они не били друг друга.... Программу надо выполнить Borland C компилятор DOSA. ...

Варианты размещения восьми ферзей на шахматной доске - C++
Само задание: Найти все варианты размещения восьми ферзей на шахматной доске таким образом, чтобы никакие две фигуры не размещались на...


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

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

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