Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
strange_man
 Аватар для strange_man
9 / 9 / 0
Регистрация: 17.05.2012
Сообщений: 117
13.11.2012, 22:37     Восемь ферзей #1
Как известно, моя цель - расставить 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;
}
Извините за комментарии на английском, пытаюсь писать на нем как могу, надо же учиться
Миниатюры
Восемь ферзей  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 22:37     Восемь ферзей
Посмотрите здесь:

Расставить 8 Ферзей на шахмотной доске... в борланд С C++
8 ферзей C++
Расстановка 8 ферзей C++
восемь ферзей на билдере C++
Перебор. Задача про ферзей. C++
задача n-ферзей C++
Разделение pi на восемь частей C++
Проверить есть ли среди ферзей пара бьющих друг друга C++
C++ Варианты размещения восьми ферзей на шахматной доске
C++ Обработать вектор, отобразив элементы по восемь слов на строку, перевести символы элементов в верхний регистр
Реализовать алгоритм всех возможных комбинаций восьми ферзей C++
C++ Что значит отобразить преобразованные элементы по восемь слов на строку? Vector

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 08:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru