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

8 ферзей - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.97
LostFrost
0 / 0 / 0
Регистрация: 07.06.2010
Сообщений: 3
07.06.2010, 20:20     8 ферзей #1
Здравствуйте. Пыталась реализовать задачу о 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;
        }
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 192
07.06.2010, 21:23     8 ферзей #2
а откуда вы такой красивый листинг списали??
LostFrost
0 / 0 / 0
Регистрация: 07.06.2010
Сообщений: 3
07.06.2010, 21:32  [ТС]     8 ферзей #3
Вообще я только учусь на программиста, так что делаю все уроки по С++, которые могу найти. Код взят из одного урока практически полностью. Мне просто интересно, как это можно реализовать, да и на экзамен по програмке мне подобную задачу дали Прошу, помогите мне с энтим делом
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 192
07.06.2010, 21:54     8 ферзей #4
вам надо просто точно так же перебирать комбинаций расстановок ферзей, только с учетом координаты , которые вводятся с клавиатуры, и так же перебирать как вы делали у себя в листинге,
только нюанс в том, что вы будете двигаться в две стороны, так что удачи
LostFrost
0 / 0 / 0
Регистрация: 07.06.2010
Сообщений: 3
08.06.2010, 22:07  [ТС]     8 ферзей #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 минут
Помогите плиз, кому не лень а то я этот экзамен до сентября не сдам
Yandex
Объявления
08.06.2010, 22:07     8 ферзей
Ответ Создать тему
Опции темы

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