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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.97
LostFrost
0 / 0 / 0
Регистрация: 07.06.2010
Сообщений: 3
#1

8 ферзей - C++

07.06.2010, 20:20. Просмотров 5726. Ответов 4
Метки нет (Все метки)

Здравствуйте. Пыталась реализовать задачу о 8 ферзях. Программа написана на С++. В принципе задача довольно распространенная - нужно расставить 8 ферзей на шахматной доске 8х8 так, чтобы они друг друга не ели. Код представлен ниже. Все в принципе работает, но вот хотелось ее еще дополнить. Нужно сделать так, чтобы программа считывала 2 числа со стандартного ввода. Эти 2 числа являются координатами первого ферзя на шахматной доске и уже относительно него расставляются все остальные. То ли я уж совсем в этом деле дура, то ли мозг за мозг уже зашел, но реализовать это у меня не получается, так что надеюсь на вашу помощь Закидаю плюсиками того, кто мне поможет Заранее спасибо

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
#include <iostream>
using namespace std;
 
int board[8][8];
 
void resetQ(int i, int j)
    {
    for(int x=0; x<8; ++x)
        {
        --board [x][j];
        --board [i][x];
        int k;
        k = j-i+x;
        if (k >= 0 && k<8)
            --board[x][k];
        k = j+i-x;
        if (k >= 0 && k<8)
            --board[x][k];
        }
    board[i][j] = 0;
    }
 
void setQ(int i, int j)
    {
    for(int x=0; x<8; ++x)
        {
        ++board [x][j];
        ++board [i][x];
        int k;
        k = j-i+x;
        if (k >= 0 && k<8)
            ++board[x][k];
        k = j+i-x;
        if (k >= 0 && k<8)
            ++board[x][k];
        }
    board[i][j] = -1;
    }
 
bool tryQ(int i)
    {
    bool result = false;
    for (int j = 0; j<8; ++j)
    {
        if (board[i][j] == 0)
        {
            setQ(i,j);
            if(i==7)
                result = true;
            else
            {
                if(!(result = tryQ(i+1)))
                    resetQ(i,j);
            }
        }
    if(result)
        break;
    }
    return result;
    }
int main()
    {
    for(int i=0; i<8; ++i)
    for(int j=0; j<8; ++j)
        board[i][j] = 0;
        tryQ(0);
    for(int i=0; i<8; ++i)
        {
        for(int j=0; j<8; ++j)
            {
            if (board[i][j] == -1)
                cout <<"[]";
            else 
                cout <<". ";
            }
        cout << endl;
        }
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2010, 20:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос 8 ферзей (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 201
07.06.2010, 21:23 #2
а откуда вы такой красивый листинг списали??
0
LostFrost
0 / 0 / 0
Регистрация: 07.06.2010
Сообщений: 3
07.06.2010, 21:32  [ТС] #3
Вообще я только учусь на программиста, так что делаю все уроки по С++, которые могу найти. Код взят из одного урока практически полностью. Мне просто интересно, как это можно реализовать, да и на экзамен по програмке мне подобную задачу дали Прошу, помогите мне с энтим делом
0
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 201
07.06.2010, 21:54 #4
вам надо просто точно так же перебирать комбинаций расстановок ферзей, только с учетом координаты , которые вводятся с клавиатуры, и так же перебирать как вы делали у себя в листинге,
только нюанс в том, что вы будете двигаться в две стороны, так что удачи
1
LostFrost
0 / 0 / 0
Регистрация: 07.06.2010
Сообщений: 3
08.06.2010, 22:07  [ТС] #5
Ну я примерно так и представляла себе как это сделать Вот с самой реализацией полнейшая труба)

Добавлено через 21 час 59 минут
С предыдущей задачей я вроде справилась, но у меня вопросец. Преподаватель упирался как мог и заставил меня вытащить код с отображением матрицы в отдельную функцию и сделать из глобального массива board локальный(по его мнению глобальные переменные - зло)). Так вот, с функциями все понятно, я тупо задаю каждый раз этот массив, а вот в main, похоже из-за его очистки, такое не проходит. Не подскажете, как это дело исправить?

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
int board[8][8];
 
void wrQ()
{   
    
    for(int i=0; i<8; ++i)
        {
            for(int j=0; j<8; ++j)
            {
                if (board[i][j] == -1)
                    cout <<"! ";
                else 
                    cout <<". ";
            }
            cout << endl;
        }
}
int main()
{
    for(int i=0; i<8; ++i)
        for(int j=0; j<8; ++j)
            board[i][j];
            tryQ(0);
            wrQ();
}
Добавлено через 1 час 55 минут
Помогите плиз, кому не лень а то я этот экзамен до сентября не сдам
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2010, 22:07
Привет! Вот еще темы с ответами:

Реализовать алгоритм всех возможных комбинаций восьми ферзей - C++
Доброго времени суток! Мне стыдно задавать такой вопрос, но всё же, как реализовать алгоритм всех возможных комбинаций восьми ферзей? ...

Проверить есть ли среди ферзей пара бьющих друг друга - C++
Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. Вам дана расстановка 8 ферзей на доске, определите,...

Нужно написать программу для расстановки 5 ферзей на шахматной доске - C++
Нужно написать программу для расстановки 5 ферзей на шахматной доске,чтобы эти 5 ферзей били всё поле и вывести число вариантов расстановки...

Расставить 8 ферзей на шахматной доске 8 на 8, которые не бьют друг друга - C++
Нужно написать программу которая расставляет на шахматной доске 8 ферзей, которые не бьют друг друга. обязательно использование рекурсии,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.06.2010, 22:07
Ответ Создать тему
Опции темы

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