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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
#1

Из листа клетчатой бумаги размером MXN клеток удалили некоторые клетки. На какое количество кусков распадется оставшаяся часть листа - C++

08.04.2009, 02:04. Просмотров 1407. Ответов 0
Метки нет (Все метки)

Помогите, пожалуйстанайти ошибку в задаче:
Из листа клетчатой бумаги размером MXN клеток удалили некоторые клетки. На какое количество кусков распадется оставшаяся часть листа.
Я реализовал с помощью циклической очереди. Алгоритм такой: пользователь вводит размеры mхn, и мы заполняем матрицу размерами m+2 на n+2 нулями, а границы (-1), долее пользователь вводит количество и значения вырезанных клеток, их так же помечаем (-1). Проходим матрицу, если значение = 0, пишем туда значение count = 1, если соседние клетки равны 0, их помещаем в очередь и тоже помечаем значением count. Затем, пока очередь не пуста, проверяем клетки в очереди на равенство с 0 и помечаем. Затем сделать count++. И так пока не пройдём всю матрицу.
Значение count – 1 и будет ответом.
Программа выдаёт неверный результат. Никак не могу найти ошибку.
Буду очень благодарен, если вы поможете!

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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
 
struct cell
{
    int x;
    int y;
};
 
class Queue
{
public:
    Queue (int n)
    {
        itsCount = n;
        itsCell = new cell [itsCount+1];
        itsFront = itsRear = 0;
    }
    ~Queue ()
    {
        delete [] itsCell;
        itsCell = NULL;
        itsCount = itsFront = itsRear = 0;
    }
 
    int GetItsFront () const
    {
        return itsFront;
    }
 
    int GetItsRear () const
    {
        return itsRear;
    }
 
    void Push (cell& c)
    {
        if ((itsRear + 1 == itsFront) || ((itsRear == itsCount) && (itsFront == 0)))
            throw "Full";
        itsCell [itsRear++] = c;
        if (itsRear > itsCount)
            itsRear = 0;
    }
 
    cell Pop ()
    {
        if (itsRear == itsFront)
            throw "Empty";
        cell k;
        k = itsCell [itsFront++];
        if (itsFront > itsCount)
            itsFront = 0;
        return k;
    }
 
    bool isEmpty ()         // Возвращает истину, если списко пустой
    {
        if (itsRear == itsFront)
            return true;
        else
            return false;
    }
 
    cell ViewFront ()
    {
        if (itsFront == 0)
            throw "Empty";
        return itsCell [itsFront];
    }
 
    cell ViewRear ()
    {
        if (itsRear == 0)
            throw "Empty";
        return itsCell [itsRear];
    }
 
private:
    cell* itsCell;
    int itsCount;
    int itsFront;
    int itsRear;
};
 
using std::cin;
using std::cout;
using std::endl;
 
int main ()
{
    setlocale (LC_ALL, ".1251");
    int const nmax = 50;
    int matrix [nmax][nmax];
    Queue q (100);
    cell cTmp;
 
    int m, n, i, j, k, l, count, x;
    cout << "Введите размеры матрицы nxm\n";
    cin >> n >> m;
 
    for (i = 0; i < n + 2; i++)
        for (j = 0; j < m + 2; j++)
            matrix [i] [j] = 0;
    count = 1;
 
    cout << "Введите количество закрашиваемых клеток\n";
    cin >> x;
    cout << "Введите координаты клеток\n";
    while (x)
    {
        cout << "x = ";
        cin >> i;
        cout << "y = ";
        cin >> j;
        cout << endl;
        matrix [i + 1] [j + 1] = -1;
        x--;
    }
 
    // Заполняем границы числами (-1)
    for (i = 0; i < n + 2; i++)
        matrix [i] [0] = -1;
    for (i = 0; i < n + 2; i++)
        matrix [i] [n + 1] = -1;
    for (j = 0; j < m + 2; j++)
        matrix [0] [j] = -1;
    for (j = 0; j < m + 2; j++)
        matrix [m + 1] [j] = -1;
 
    bool flag = true;
    while (flag == true)
    {
        for (i = 0; i < n + 2; i++)
            for (j = 0; j < m + 2; j++)
            {
                if (matrix [i] [j] == 0)
                {
                    k = cTmp.x = i;
                    l = cTmp.y = j;
                    q.Push (cTmp);                  
                    while (!q.isEmpty ())
                    {
                        if (matrix [k+1] [l] == 0)
                        {
                            cTmp.x = k + 1; cTmp.y = l;
                            q.Push (cTmp);
                            matrix [k+1] [l] = count;
                        }
                        if (matrix [k - 1][l] == 0)
                        {
                            cTmp.x = k - 1; cTmp.y = l;
                            q.Push (cTmp);
                            matrix [k - 1][l] = count;
                        }
                        if (matrix [k] [l+1] == 0)
                        {
                            cTmp.x = k; cTmp.y = l + 1;
                            q.Push (cTmp);
                            matrix [k] [l+1] = count;
                        }
                        if (matrix [k] [l - 1] == 0)
                        {
                            cTmp.x = k; cTmp.y = l - 1;
                            q.Push (cTmp);
                            matrix [k] [l - 1] = count;
                        }
                        cTmp = q.Pop ();
                        k = cTmp.x;
                        l = cTmp.y;
                        matrix [k] [l] = count;
                    }
                }
                if ((i == n + 1) && (j == m + 1))
                    flag = false;
                count++;
            }
    }
    count--;
    cout << count;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2009, 02:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Из листа клетчатой бумаги размером MXN клеток удалили некоторые клетки. На какое количество кусков распадется оставшаяся часть листа (C++):

Из листа клетчатой бумаги размером M умножить N клеток удалили некоторые клетки - C++
Из листа клетчатой бумаги размером m * N клеток удалили некоторые клетки. На сколько кусков распадется оставшаяся часть листа? Пример....

из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа? - C++
условие:из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа? Первая строка...

На сколько кусков распадется часть листа, если из него вырезать некоторые клетки? Есть алгоритм. - C++
Из листа клетчатой бумаги размером М*N клеток удалили некоторые клетки. На сколько кусков распадется оставшаяся часть листа? Пример....

Списки, Стеки,Очереди (На сколько кусков распадется оставшаяся часть листа? ) - C++
Доброго всем времени суток!! Помогите написать программу: Из листа клетчатой бумаги размером М*N клеток удалили некоторые клетки. На...

Создать программу (Подсчитать, на сколько кусков распадется оставшаяся часть листа). - C++
Из листа клетчатой бумаги размером M*K клеток удалили некоторые клетки. Подсчитать, на сколько кусков распадется оставшаяся часть листа. ...

Из листа бумаги со сторонами a и b свернуть коробочку с максимальным объемом. - C++
Из прямоугольного листа бумаги со сторонами a и b надо свернуть коробочку с максимальной площадью, какая будет длина стороны. Помогите...

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

Из листа клетчатой бумаги размером М*Н клеток удалили некоторые клетки. На сколько кусков распадется оставшаяся часть листа? - Turbo Pascal
Срочно нужна помощь в выполнении данной задачи, т.к. в Паскале я полный 0. кому не сложно и есть время - выручите. Буду очень признателен

Есть полоска бумаги шириной a и длиной b см. На какое максимальное количество квадратиков размером a x a см можно ее разрезать? Входные данные вводятс - Pascal ABC
Есть полоска бумаги шириной a и длиной b см. На какое максимальное количество квадратиков размером a x a см можно ее разрезать? Входные...

Как сделать, чтобы с активного листа некоторые ячейки копировались в один лист, а некоторые - в другой? - VBA
задача. есть таблица в которой 4 столбца. эти четыре столбца должны с капировался так. Первый столбец в лист1, второй в лист два,...

SCX 4200 при выбрасывании листа бумаги тянет и второй тоже. Что делать? - Принтеры, МФУ
МФУ Samsung SCX 4200 при печати наполовину выводит один лист бумаги и тут же начинает тащить за ним второй лист бумаги. Как починить?...


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

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

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