Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
1

Посчитать, сколько закрашенно прямоугольников на поле

19.08.2009, 14:17. Показов 4225. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть клетчатое прямоугольное поле с размерами m на n, на этом поле по линиям сетки закрашено несколько прямоугольников все одним цветом, задача посчитать сколько закрашенно прямоугольников на поле, пользователь вводит значения m и n, и построчно состояние клеток поля
пример:
5
6
00000
00110
00110
00000
01110
01110
Программа должна определить сколько прямоугольников закрашено и почитать их кол-во
В этом примере 2 прямоугольника закрашены
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2009, 14:17
Ответы с готовыми решениями:

OpenCV: определить сколько на фото кругов и сколько прямоугольников
есть несколько фото и нужно определить сколько на фото кругов и сколько прямоугольников

Посчитать наименьшую площадь нескольких прямоугольников
Вводится количество прямоугольников, вводится противоположные точки (x1y1 x3y3), программа считает...

Посчитать количество прямоугольников, заданных черным цветом
С++ изучаю несколько месяцев и есть проблемы с синтаксисом и пониманием=) Не совсем понятно что от...

Метод прямоугольников - посчитать интеграл по левой, правой и средней точке
Доброго времени суток! Такой вопрос, есть программа по методу прямоугольников: #include <conio.h>...

30
1 / 1 / 0
Регистрация: 31.07.2009
Сообщений: 40
19.08.2009, 15:02 2
00000
00110
00110
00000
01110
01110
мне кажется задача некоректно поставленна
Любая клетка может быть прямоугольником ?
Сколько клеток должно быть закрашено для полного прямоугольника?
Учитывается ли то что в прямоугольнике есть полость (пустота, нули итд)?
Определитесь с этим определитесь и с алгоритмом
0
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
20.08.2009, 16:24  [ТС] 3
Цитата Сообщение от Sahamar Посмотреть сообщение
00000
00110
00110
00000
01110
01110
мне кажется задача некоректно поставленна
Любая клетка может быть прямоугольником ?
Сколько клеток должно быть закрашено для полного прямоугольника?
Учитывается ли то что в прямоугольнике есть полость (пустота, нули итд)?
Определитесь с этим определитесь и с алгоритмом
1 это закрашенная клетка, 0 не закрашенная, как введешь так и будет

Добавлено через 5 часов 21 минуту 11 секунд
ну помогите пожалуйсто
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
20.08.2009, 17:26 4
Вы не ответили на выше поставленный вопрос:

Цитата Сообщение от Sahamar Посмотреть сообщение
Учитывается ли то что в прямоугольнике есть полость (пустота, нули итд)?
1
1 / 1 / 0
Регистрация: 31.07.2009
Сообщений: 40
21.08.2009, 07:50 5
проверяем mass[i][j] если 1 то проверяем mass [i+1][j] если нет выходим из подцикла если да то проверяем [i-1][j] если есть 1 то проверяем [i][j+1] если да то проверяем [i][j-1] что то вроде этого.
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.08.2009, 10:00 6
Это в том случае, если не разрешено в прямоугольнике 0... Вот жду ответа. А человек что-то молчит.
1
1 / 1 / 0
Регистрация: 31.07.2009
Сообщений: 40
21.08.2009, 10:13 7
01110
01010
01110
00000
10000
00110
пойдем по другому пути сколько сдесь прямоугольников ?
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.08.2009, 10:30 8
теоретически, если расщитывать на 0 в прямоугольнике - то 1

Добавлено через 10 минут 23 секунды
Опять же таки с такого примера возникает вопрос могут ли быть единицы сами по себе, не образующие прямоугольник?
1
1 / 1 / 0
Регистрация: 31.07.2009
Сообщений: 40
21.08.2009, 11:03 9
Цитата Сообщение от homich77 Посмотреть сообщение
теоретически, если расщитывать на 0 в прямоугольнике - то 1

Добавлено через 10 минут 23 секунды
Опять же таки с такого примера возникает вопрос могут ли быть единицы сами по себе, не образующие прямоугольник?
У меня была похожая задача только мне нужно было найти в матрице число которое окружено сверху справа слева снизу большими значениями.
Может поможет выложу код
Извращение но работает )
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
            listBox1.Items.Clear();
            dataGridView1.Rows.Clear();
            int[,] mass = new int[5, 6];
            string result = "";
            Random unit_mass = new Random();
            for (int i = 0; i < 5; i++)
            {
                DataGridViewRow rw = dataGridView1.Rows[dataGridView1.Rows.Add()];
                for (int j = 0; j < 6; j++)
                {
                    mass[i, j] = unit_mass.Next(50);
                    rw.Cells[j].Value = mass[i, j];
                }
            }
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    int znak = mass[i, j];
                    switch (i)
                    {
                        case 0:
                            if (j == 0)
                            {
                                if (znak > mass[i + 1, j] && znak > mass[i, j + 1])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            else if (j > 0 && j < 5)
                            {
                                if (znak > mass[i + 1, j] && znak > mass[i, j + 1] && znak > mass[i, j - 1])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            else if (j == 5)
                            {
                                if (znak > mass[i + 1, j] && znak > mass[i, j - 1])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            break;
                        case 4:
                            if (j == 0)
                            {
                                if (znak > mass[i - 1, j] && znak > mass[i, j + 1])
                                { 
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            else if (j > 0 && j < 5)
                            {
                                if (znak > mass[i - 1, j] && znak > mass[i, j + 1] && znak > mass[i, j - 1])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            else if (j == 5)
                            {
                                if (znak > mass[i - 1, j] && znak > mass[i, j - 1])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            break;
                        default:
                            if (j == 0)
                            {
                                if (znak > mass[i + 1, j] && znak > mass[i, j + 1] && znak > mass[i - 1, j])
                                { 
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            else if (j > 0 && j < 5)
                            {
                                if (znak > mass[i - 1, j] && znak > mass[i + 1, j] && znak > mass[i, j - 1] && znak > mass[i, j + 1])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            else if (j == 5)
                            {
                                if (znak > mass[i + 1, j] && znak > mass[i, j - 1] && znak > mass[i - 1, j])
                                {
                                    result += znak + "[" + (i + 1) + "," + (j + 1) + "] \n";
                                    listBox1.Items.Add(znak + "[" + (i + 1) + "," + (j + 1) + "]");
                                }
                            }
                            break;
                    }
                }
            }
В этом коде стоит проверка на крайние поля поэтому столько условий )))
0
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
21.08.2009, 11:42  [ТС] 10
Цитата Сообщение от homich77 Посмотреть сообщение
теоретически, если расщитывать на 0 в прямоугольнике - то 1

Добавлено через 10 минут 23 секунды
Опять же таки с такого примера возникает вопрос могут ли быть единицы сами по себе, не образующие прямоугольник?
нет единицы могут например вот так 00111011
а нули не могут быть как в тех примерах
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.08.2009, 11:57 11
Цитата Сообщение от vauper Посмотреть сообщение
а нули не могут быть как в тех примерах
Вообщем тут набросано пример, где находятся 4 угла прямоугольников (т.е. внутри них может быть что угодно)
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
int[,] mas = new int[6, 5];
            mas[1, 2] = 1;
            mas[1, 3] = 1;
            mas[2, 2] = 1;
            mas[2, 3] = 1;
 
            mas[4, 1] = mas[4, 2] = mas[4, 3] = 1;
            mas[5, 1] = mas[5, 2] = mas[5, 3] = 1;
 
            int amount = 0, coef_i0 = 0, coef_j0 = 0, coef_in = 0, coef_jn = 0;
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 5; j++) {
                    if (mas[i, j] == 1 && j < 5) {//если встречается 1 (левый верхний угол прямоугольника)
                        coef_i0 = i;
                        coef_j0 = j;
                        while (mas[coef_i0, j] == 1) {
                            if (j + 1 == 5 || mas[coef_i0, j + 1] == 0 && j != coef_j0) {//находим правый верхний конец прямоугольника
                                coef_jn = j;
                                for (int k = coef_i0 + 1; k < 6; k++) {//поиск нижних углов
                                    if (mas[k, coef_j0] == 1 && mas[k, coef_jn] == 1) {
                                        coef_in = k;
                                        if (k + 1 == 6 || mas[k + 1, coef_j0] == 0 && mas[k + 1, coef_jn] == 0) {// если заканчивается количество строк, либо в след. строке находится 0 - значит 4угла найдены
                                            amount++;
                                            i = coef_in;
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                            j++;
                        }
                    }
                }
            }
            label1.Text = amount.ToString();
но здесь ещё не отработан момент: если на этой же строке дальше по j находится ещё прямоугольник. Ну как основу тут видно. А если ещё и проверить чтобы все 1 были внутри, то в поиске нижних углов, кроме условия :
C#
1
if (mas[k, coef_j0] == 1 && mas[k, coef_jn] == 1)
надо ещё по циклу от j0 до jn задать чтобы были 1, если нет - то break.
1
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
21.08.2009, 12:06  [ТС] 12
Как я и писал надо задать значение длины прямоугольника и ширины , а потом построчно состояния клеток, т.е если ввести 10, 8
и строки например
0000000000
0110111100
0110111100
0000000000
0000000000
0000000000
0011111110
0011111110
то здесь 3 прямоугольника
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.08.2009, 12:12 13
ну так введи вместо 5 - переменную, кот. будет передавать кол-во столбцов, а вместо 6 - перменную, отвечающую за кол-во строк. Что не понятно?
1
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
21.08.2009, 12:20  [ТС] 14
Цитата Сообщение от homich77 Посмотреть сообщение
ну так введи вместо 5 - переменную, кот. будет передавать кол-во столбцов, а вместо 6 - перменную, отвечающую за кол-во строк. Что не понятно?
не понятно то что прийдется переписывать пол кода , потому что он у тебя написано только на 5, 6 , а числа над вводить в консоле

Добавлено через 2 минуты 58 секунд
а если числа буду 4 х 5 значный мне что прийдется каждую строку дописывать??
mas[1, 2] = 1;
mas[1, 3] = 1;
mas[2, 2] = 1;
mas[2, 3] = 1;

mas[4, 1] = mas[4, 2] = mas[4, 3] = 1;
mas[5, 1] = mas[5, 2] = mas[5, 3] = 1;
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.08.2009, 12:35 15
Во-первых!!! Надо говорить, в чём ты собираешься делать. Если консоль - то это пишут в начале!!!
А во-вторых! Было написано алгоритм, а теперь, увидев пример, своей головой можно додумать как написать. Или за тебя писать полностью алгоритм? Тогда ты не туда зашёл! Здесь помогает, а не пишут за других!

Добавлено через 7 минут 25 секунд
Давай сначала. ты при вводе в консоле записываешь все данные в массив?

Добавлено через 4 минуты 56 секунд
Даже не так. ты вводишь вначале кол-во столбцов, потом кол-во строк.
Пусть кол-во строк - это переменная amount_rows,
кол-во столбцов - это переменная amount_columns.
Тогда код такой:
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
int amount = 0, coef_i0 = 0, coef_j0 = 0, coef_in = 0, coef_jn = 0;
            for (int i = 0; i < amount_rows; i++) {
                for (int j = 0; j < amount_columns; j++) {
                    if (mas[i, j] == 1 && j < amount_columns) {//если встречается 1 (левый верхний угол прямоугольника)
                        coef_i0 = i;
                        coef_j0 = j;
                        while (mas[coef_i0, j] == 1) {
                            if (j + 1 == amount_columns || mas[coef_i0, j + 1] == 0 && j != coef_j0) {//находим правый верхний конец прямоугольника
                                coef_jn = j;
                                for (int k = coef_i0 + 1; k < amount_rows; k++) {//поиск нижних углов
                                    if (mas[k, coef_j0] == 1 && mas[k, coef_jn] == 1) {
                                        coef_in = k;
                                        if (k + 1 == amount_rows || mas[k + 1, coef_j0] == 0 && mas[k + 1, coef_jn] == 0) {// если заканчивается количество строк, либо в след. строке находится 0 - значит 4угла найдены
                                            amount++;
                                            i = coef_in;
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                            j++;
                        }
                    }
                }
            }
и выводишь свою переменную amount.
1
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
21.08.2009, 12:48  [ТС] 16
Даже не так. ты вводишь вначале кол-во столбцов, потом кол-во строк.
Пусть кол-во строк - это переменная amount_rows,
кол-во столбцов - это переменная amount_columns.
потом я ввожу в зависимости от числа столбцов и строк состояние клеток поля т.е вот это 00110
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
21.08.2009, 17:11 17
Цитата Сообщение от vauper Посмотреть сообщение
потом я ввожу в зависимости от числа столбцов и строк состояние клеток поля т.е вот это 00110
я не могу понять: ты не знаешь как считать в консоле эти строки и закинуть в массив? ты спрашиваешь как это сделать?

Добавлено через 2 часа 30 минут 40 секунд
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
static void Main(string[] args) {
            Work();
            Console.Write("Если вы хотите выйти из программы, нажмите Enter. Если хотите повторить, нажмите r.\n");
            string s = Console.ReadLine();
            if (s == "13") {
                return;
            }
            if (s == "r") {
                Console.Clear();
                Work();
            }
        }
 
        static void Work() {
            Console.WriteLine("Введите кол-во столбцов:");
            int amount_columns = 0;
            Int32.TryParse(Console.ReadLine(), out amount_columns);
            Console.WriteLine("Введите кол-во строк:");
            int amount_rows = 0;
            Int32.TryParse(Console.ReadLine(), out amount_rows);
            if (amount_rows == 0 || amount_columns == 0) {
                Console.Write("Error!");
                return;
            }
            int[,] mas = new int[amount_rows, amount_columns];
            Console.WriteLine("Введите массив:");
            for (int i = 0; i < amount_rows; i++) {
                Console.WriteLine(String.Format("Введите строку №{0}", i + 1));
                string str = Console.ReadLine();
                if (str.Length != amount_columns) {
                    Console.WriteLine(String.Format("Вы ввели некорректное кол-во значений!"));
                    i--;
                } else {
                    for (int j = 0; j < amount_columns; j++) {
                        Int32.TryParse(str[j].ToString(), out mas[i, j]);
                    }
                }
            }
            int amount = 0, coef_i0 = 0, coef_j0 = 0, coef_in = 0, coef_jn = 0;
            for (int i = 0; i < amount_rows; i++) {
                for (int j = 0; j < amount_columns; j++) {
                    if (mas[i, j] == 1 && j < amount_columns) {//если встречается 1 (левый верхний угол прямоугольника)
                        coef_i0 = i;
                        coef_j0 = j;
                        while (mas[coef_i0, j] == 1) {
                            if (j + 1 == amount_columns || mas[coef_i0, j + 1] == 0 && j != coef_j0) {//находим правый верхний конец прямоугольника
                                coef_jn = j;
                                for (int k = coef_i0 + 1; k < amount_rows; k++) {//поиск нижних углов
                                    if (mas[k, coef_j0] == 1 && mas[k, coef_jn] == 1) {
                                        coef_in = k;
                                        if (k + 1 == amount_rows || mas[k + 1, coef_j0] == 0 && mas[k + 1, coef_jn] == 0) {// если заканчивается количество строк, либо в след. строке находится 0 - значит 4угла найдены
                                            amount++;
                                            i = coef_in;
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                            j++;
                        }
                    }
                }
            }
            Console.Write(String.Format("Кол-во прямоугольников = {0}.\n", amount.ToString()));
        }
Добавлено через 4 минуты 59 секунд
а вообще есть хотя бы ссылка в мсдн-е, начинай от туда:
мсдн

Не по теме:

Помогло - скажи спасибо! :good:



Добавлено через 1 час 35 минут 49 секунд
Можно понять что получилось?
1
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
21.08.2009, 19:31  [ТС] 18
я тебе и так на каждом посте спасибки тыкнул
0
0 / 0 / 0
Регистрация: 30.07.2009
Сообщений: 24
02.09.2009, 14:44  [ТС] 19
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
static void Main(string[] args) {
            Work();
            Console.Write("Если вы хотите выйти из программы, нажмите Enter. Если хотите повторить, нажмите r.\n");
            string s = Console.ReadLine();
            if (s == "13") {
                return;
            }
            if (s == "r") {
                Console.Clear();
                Work();
            }
        }
 
        static void Work() {
            Console.WriteLine("Введите кол-во столбцов:");
            int amount_columns = 0;
            Int32.TryParse(Console.ReadLine(), out amount_columns);
            Console.WriteLine("Введите кол-во строк:");
            int amount_rows = 0;
            Int32.TryParse(Console.ReadLine(), out amount_rows);
            if (amount_rows == 0 || amount_columns == 0) {
                Console.Write("Error!");
                return;
            }
            int[,] mas = new int[amount_rows, amount_columns];
            Console.WriteLine("Введите массив:");
            for (int i = 0; i < amount_rows; i++) {
                Console.WriteLine(String.Format("Введите строку №{0}", i + 1));
                string str = Console.ReadLine();
                if (str.Length != amount_columns) {
                    Console.WriteLine(String.Format("Вы ввели некорректное кол-во значений!"));
                    i--;
                } else {
                    for (int j = 0; j < amount_columns; j++) {
                        Int32.TryParse(str[j].ToString(), out mas[i, j]);
                    }
                }
            }
            int amount = 0, coef_i0 = 0, coef_j0 = 0, coef_in = 0, coef_jn = 0;
            for (int i = 0; i < amount_rows; i++) {
                for (int j = 0; j < amount_columns; j++) {
                    if (mas[i, j] == 1 && j < amount_columns) {//если встречается 1 (левый верхний угол прямоугольника)
                        coef_i0 = i;
                        coef_j0 = j;
                        while (mas[coef_i0, j] == 1) {
                            if (j + 1 == amount_columns || mas[coef_i0, j + 1] == 0 && j != coef_j0) {//находим правый верхний конец прямоугольника
                                coef_jn = j;
                                for (int k = coef_i0 + 1; k < amount_rows; k++) {//поиск нижних углов
                                    if (mas[k, coef_j0] == 1 && mas[k, coef_jn] == 1) {
                                        coef_in = k;
                                        if (k + 1 == amount_rows || mas[k + 1, coef_j0] == 0 && mas[k + 1, coef_jn] == 0) {// если заканчивается количество строк, либо в след. строке находится 0 - значит 4угла найдены
                                            amount++;
                                            i = coef_in;
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                            j++;
                        }
                    }
                }
            }
            Console.Write(String.Format("Кол-во прямоугольников = {0}.\n", amount.ToString()));
        }


кто нить может исправить этот код что бы считало через 1 угол а не через 4 и при таком вводе 0001 он тоже считал за прямоугольник, а то в этом коде только если в конце есть 0 считает
0
81 / 80 / 4
Регистрация: 06.04.2009
Сообщений: 326
04.09.2009, 15:33 20
в этом коде только если в конце есть 0 считает
не понятно, что ты имел ввиду - конкретный пример напиши, чтобы можно было просмотреть что не так.
при таком вводе 0001 он тоже считал за прямоугольник
мною же ранее был поставлен вопрос по этому поводу! Сейчас пересмотрю.

Добавлено через 16 минут
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
static void Main(string[] args) {
            Work();
            Console.Write("Если вы хотите выйти из программы, нажмите Enter. Если хотите повторить, нажмите r.\n");
            string s = Console.ReadLine();
            while (s == "r") {
                Console.Clear();
                Work();
                Console.Write("Если вы хотите выйти из программы, нажмите Enter. Если хотите повторить, нажмите r.\n");
                s = Console.ReadLine();
            }
            if (s == "13") {
                return;
            }
        }
 
        static void Work() {
            Console.WriteLine("Введите кол-во столбцов:");
            int amount_columns = 0;
            Int32.TryParse(Console.ReadLine(), out amount_columns);
            Console.WriteLine("Введите кол-во строк:");
            int amount_rows = 0;
            Int32.TryParse(Console.ReadLine(), out amount_rows);
            if (amount_rows == 0 || amount_columns == 0) {
                Console.Write("Error!");
                return;
            }
            int[,] mas = new int[amount_rows, amount_columns];
            Console.WriteLine("Введите массив:");
            for (int i = 0; i < amount_rows; i++) {
                Console.WriteLine(String.Format("Введите строку №{0}", i + 1));
                string str = Console.ReadLine();
                if (str.Length != amount_columns) {
                    Console.WriteLine(String.Format("Вы ввели некорректное кол-во значений!"));
                    i--;
                } else {
                    for (int j = 0; j < amount_columns; j++) {
                        Int32.TryParse(str[j].ToString(), out mas[i, j]);
                    }
                }
            }
            int amount = 0, coef_i0 = 0, coef_j0 = 0, coef_in = 0, coef_jn = 0;
            for (int i = 0; i < amount_rows; i++) {
                for (int j = 0; j < amount_columns; j++) {
                    if (mas[i, j] == 1 && j < amount_columns) {//если встречается 1 (левый верхний угол прямоугольника)
                        coef_i0 = i;
                        coef_j0 = j;
                        while (mas[coef_i0, j] == 1) {
                            if (j + 1 == amount_columns || mas[coef_i0, j + 1] == 0) {//находим правый верхний конец прямоугольника
                                coef_jn = j;
                                for (int k = coef_i0; k < amount_rows; k++) {//поиск нижних углов
                                    if (mas[k, coef_j0] == 1 && mas[k, coef_jn] == 1) {
                                        coef_in = k;
                                        if (k + 1 == amount_rows || mas[k + 1, coef_j0] == 0 && mas[k + 1, coef_jn] == 0) {// если заканчивается количество строк, либо в след. строке находится 0 - значит 4угла найдены
                                            amount++;
                                            i = coef_in;
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                            j++;
                        }
                    }
                }
            }
            Console.Write(String.Format("Кол-во прямоугольников = {0}.\n", amount.ToString()));
        }
Добавлено через 1 минуту
здесь срабатывает подсчёт такого плана. Например:
0100
0001
0100
0100
будет считать как 3 прямоугольника.
1
04.09.2009, 15:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2009, 15:33
Помогаю со студенческими работами здесь

Посчитать сумму площадей двух прямоугольников, стороны которых заданы
Надо посчитать суму площадей двух прямоугольников, стороны которых заданы. Но посчитать надо...

Посчитать,сколько элементов массива равны 5 или сколько 5 в массиве
Посчитать,сколько элементов массива равны 5 или сколько 5 в массиве Желательно полная программа...

Сколько прямоугольников в матрице
На квадратном клетчатом листе бумаги(размера МхМ клеток) нарисовано несколько прямоугольников....

Сколько всего прямоугольников?
Нужно написать программу, которая сосчитает общее число прямоугольников. (смотрите рисунок) ......


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru