Форум программистов, компьютерный форум, киберфорум
Комбинаторика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90

Определить количество способов укладки паркета

14.10.2016, 14:44. Показов 6951. Ответов 31

Студворк — интернет-сервис помощи студентам
Всем привет. Помогите пожалуйста разобраться в решении задачи о паркете.

Собственно сама задача:
Комнату размером n*m единиц требуется покрыть одинаковыми плитками паркета размером 2*1 единиц без пропусков и наложений (m<=20, n<=8, m,n -целые). Пол можно покрыть паркетом различными способами. Требуется определить количество всех возможных способов укладки паркета для конкретных значений m<=20, n<=8. Результатом задачи является таблица, содержащая 20 строк и 8 столбцов.Элементом таблицы является число, являющееся решением задачи для соответствующих n и m.

Решения этой задачи:
Файл pdf - книга Окулова Программирование в алгоритмах - стр 120.
она же для тех кто не хочет качать

Просто вообще не дается осознание этого решения. Вводятся какие то сечения закодированные в единицах и нулях. Но если мы предполагаем подсчет вариантов полностью заполненного поля - зачем нули в сечениях. А если плитка расположена перпендикулярно этому самому сечению - как мы поймем в каком сечении ее продолжение. Вобщем вообще ничего не удается понять(
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2016, 14:44
Ответы с готовыми решениями:

Определить количество способов укладки плиток на оставшиеся места
Задача G. Укладка плитки (Время: 1 сек. Память: 16 Мб Баллы: 100) В процессе ремонта в Лаборатории Информационных Технологий строителям...

Определить количество различных способов допрыгать до финиша
Девочка Ксюша любит играть в линейные классики,отличается от стандартной тем,что клетки расположены в одну линию длиной N.Задача игры...

Определить количество способов перемещения по смежным граням куба
Может кто-то помочь срочно решить олимпиадную задачку. Поверхность куба отрезками, параллельными к ребрам куба, разделена на...

31
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
14.10.2016, 17:23
Там же просто, как всё гениальное
Проводим вертикаль. Идём сверху вниз и заполняем число: если вертикаль проходит по границе плиток — ставим ноль, если разрезаем плитку — 1.
Дальше медитируем на связь соседних вертикалей: если, скажем, в левой ноль, то в правой может быть ноль либо единица; если в левой единица, то в правой только ноль.
На самом деле, там чуток посложнее (например, в обеих нули на некой позиции требуют аналогичного выше либо ниже); однако же, куда проще исходной задачи
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
15.10.2016, 16:52  [ТС]
iifat, так уже гораздо понятнее спасибо)

Поправьте если ошибаюсь, но в книге совсем другое объяснение, цитата: "Плитки, встречающиеся на пути разреза, обходим справа, т. е. при движении сверху вниз на каждом шаге либо обходим справа выступающую клетку, либо нет"

При таком подходе совершенно не понятно как определить горизонтально располагаются плитки или нет.

Хотя теперь не понятно как определить наличие или отсутствие плитки. если только объединить ваш способ и предложенный в книге. Я в том направлении мыслю?

Добавлено через 15 минут
Или случаи когда есть пустые клетки мы вообще не рассматриваем?
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
15.10.2016, 19:01
Лучший ответ Сообщение было отмечено Serg4356 как решение

Решение

Цитата Сообщение от Serg4356 Посмотреть сообщение
в книге совсем другое объяснение
Слова другие, объяснение то же. Плитку, которая лежит горизонтально поперёк вертикали, в книге обходят справа, а я нагло режу пополам. Вот и вся разница.
Цитата Сообщение от Serg4356 Посмотреть сообщение
непонятно как определить горизонтально располагаются плитки или нет
В данном методе неважно. Если в позиции единица, плитка лежит горизонтально; если ...101..., то все три плитки горизонтальны; а вот при двух нулях подряд возможны два варианта (если нулей подряд больше, число вариантов ещё возрастает).
Цитата Сообщение от Serg4356 Посмотреть сообщение
случаи когда есть пустые клетки мы вообще не рассматриваем?
Разумеется. Только полное заполнение.
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
15.10.2016, 21:23  [ТС]
Цитата Сообщение от iifat Посмотреть сообщение
а я нагло режу пополам.
Это в дуриллион раз лучше объясняет принцип. Жалко, что не все заинтересованы в понимании посредственными читателями) Спасибо)
0
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
15.10.2016, 21:35  [ТС]
Вот то есть как как то так должно получаться?
Миниатюры
Определить количество способов укладки паркета  
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
16.10.2016, 05:40
Получиться — что? Рельефы — первый, второй, третий — выписаны верно. Не хватает нулевого и четвёртого. Но это ж только начало...
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
19.10.2016, 14:12  [ТС]
Пока не понимаю назначения 0 и 4 сечения, тк они всегда должны быть нулевыми. Ну да начало...

Нашел программу реализующую решение этой задачи, но в ней что то не так, тк количество расположений для комнаты длиной/шириной 2 клетки это не ряд Фибоначчи.

Собственно сам код:

Кликните здесь для просмотра всего текста
Java
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
import java.math.BigInteger;
 
public class Main {
 
    //Временная, для вычислений
    static BigInteger[][] B = new BigInteger[256][21];
    //Результирующая таблица
    static BigInteger[][] A = new BigInteger[9][21];
 
    //Вычисляет k - ю степень 2
    public static long St2(int k) {
        if (k <= 0) {
            return 1;
        } else {
            return (long) Math.pow(2, k);
        }
    }
 
    //{k,l -номера сечений, pi - количество анализируемых разрядов сечений}
    public static boolean Can(int k, int l, int pi) {
        int i;
        long d;
        boolean b, res;
        res = false;
        b = false;
        for (i = 1; i <= pi; i++) {
            d = St2(i);
            if ((k & d) == 0) //{определяется значение разряда с номером d для сечения k}
            {
                if ((l & d) == 0) {
                    b = !b;
                } else {
                    if (b) {
                        return false;
                    }
                }
            } else if (((l & d) != 0) || b) {
                return false;
            }
        }
        ;
        res = !b;
        return res;
    }
 
    //Основная логика
    public static void Solve() {
        int i, j, k, l;
        long max;
        //Цикл по значению длины комнаты
        for (i = 1; i <= 8; i++) {
            max = St2(i) - 1;
            B[0][0] = BigInteger.ONE;
            //Цикл по значению ширины комнаты
            for (j = 1; j <= 20; j++) {
                //Сечение с номером k
                for (k = 0; k <= max; k++) {
                    //Сечение с номером l
                    for (l = 0; l <= max; l++) //if (Can(k,l,i))
                    {
                        //Проверка совместимости сечений
                        boolean r = Can(k, l, i);
                        if (r) {
                            B[k][j] = B[k][j].add(B[l][j - 1]);
                        }
                    }
                }
                A[i][j] = B[0][j];
            }
        }
    }
 
    public static void main(String[] args) {
        //забиваем нулями таблицы
        for (int m = 0; m <= 20; m++) {
            for (int n = 0; n <= 8; n++) {
                A[n][m] = BigInteger.ZERO;
            }
        }
        for (int m = 0; m <= 20; m++) {
            for (int n = 0; n <= 255; n++) {
                B[n][m] = BigInteger.ZERO;
            }
        }
        //производим расчет
        Solve();
 
        //выводим результаты
        for (int m = 1; m <= 20; m++) {
            for (int n = 1; n <= 8; n++) {
 
                if (n * m % 2 != 0) {
                    String val="*";
                    for(int p=0;p<25;p++)
                        val+=" ";
                    System.out.print(val);
                } else
                if (m == 1 && n % 2 == 0) {
                    String val="1";
                    for(int p=0;p<25;p++)
                        val+=" ";
                    System.out.print(val);
                } else {
                    String val=A[n][m].toString();
                    int v=val.length();
                    for(int p=0;p<26-v;p++)
                        val+=" ";
                    System.out.print(val);
                }
            }
            System.out.println();
        }
    }
}


В данной программе не понятен метод Can(), где сечение зачем то сопоставляется со степенью 2, и метод Solve() где в цикле проверяются все варианты сечений, а в этом месте:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
               //Проверка совместимости сечений
                        boolean r = Can(k, l, i);
                        if (r) {
                            B[k][j] = B[k][j].add(B[l][j - 1]);
                        }


счетчик количества вариантов заполнения увеличивается не в момент заполнения всего поля, а в момент нахождения соответствующих друг другу сечений(если я правильно понял метод Can)
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
19.10.2016, 16:16
Дык именно и весь алгоритм.
Последовательно для каждой вертикали и каждого сечения считаем варианты плотных укладок.
Шаг (вертикальное сечение https://www.cyberforum.ru/cgi-bin/latex.cgi?i+1) состоит в подсчёте вариантов укладки для каждого сечения (коих https://www.cyberforum.ru/cgi-bin/latex.cgi?2^20).
Подсчёт вариантов укладки: есть совместимые и несовместимые соседние сечения — это понятно, да? Например, если в 5 сечении где-то стоит единица, то бишь, пятое сечение разрезает плитку, то в шестом обязан стоять нуль. Судя по алгоритму, промежуток между двумя совместимыми сечениями можно замостить единственным способом (что-то мне это сомнительно, но это я потом подумаю). Итак: если на шестой вертикали сечение вот такое, то на пятой одно из совместимых, причём достраивается единственным способом. То бишь, количество способов замостить прямоугольник слева до конкретного сечения шестой линии равно сумме аналогичных способов для совместимых сечений пятой линии.

Добавлено через 38 секунд
И да, процедуру Can ещё не просёк до конца. Подумаю и напишу.

Добавлено через 8 минут
Собственно, совместимость определяется так.
По каждому разряду.
(0,1) (в смысле, в i-м 0 (i-я вертикаль не разрезает плитку), в i+1-м 1 (i+1-я вертикаль разрезает)) — допустимо (необходимо положить одну плитку горизонтально вплотную к i-й вертикали);
(1,0) — допустимо и получается автоматически;
(1,1) — недопустимо;
(0,0) — допустимо, если в следующеё позиции та же конфигурация (необходимо положить плитку вертикально, так что она займёт две горизонтали).
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
19.10.2016, 19:36  [ТС]
Цитата Сообщение от iifat Посмотреть сообщение
Шаг (вертикальное сечение ) состоит в подсчёте вариантов укладки для каждого сечения (коих ).
это вообще не понял

Вот если у нас количество разрядов(длина пола) = 4, а первое сечение - это 0 (0000) второе 3 (0011), метод Can выдает - false. Почему? В программе я понимаю логику и почему так вышло, но на практике?
На картинке, которую я выше прикладывал как раз такая ситуация с сечениями(если брать второе и третье сечение). И почему в этом методе сравниваются не аргументы k, l (которые вроде как сами по себе являются этими сечениями) между собой, а сравниваются с каким-то d, которое = количество разрядов в квадрате?

И в любом случае насчет корректности решения, опытным путем я получил:
при размерах пола:
mКол-во решений, при n=2
11
22
33
45
58
613
721

Программа выдает решение: 0|2|4|10|18... Как так?
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
20.10.2016, 02:45
Цитата Сообщение от Serg4356 Посмотреть сообщение
В программе я понимаю логику и почему так вышло
Хм. А я вот нет. Посмотрел по программе — должна, имхо, выдавать истину: как понимаю, вызывается Can(0,3,4), в 28-й строке четыре раза проход по ветке then, при этом в 30-й два раза по then (b false->true->false), потом два раза по else... А, вот где собака, имхо, зарыта! Там && должно быть, а не ||.
А, несколько соврал, разряды проходятся справа налево, так что false будет выдана сразу. Впрочем, это мало что меняет.
Цитата Сообщение от Serg4356 Посмотреть сообщение
сравниваются с каким-то d, которое = количество разрядов в квадрате?
А вот не путай «n в квадрате» и «два в n-й степени»!
d — никакое не количество разрядов. d — маска для выделения очередного разряда. Чтобы выделить i-й разряд (считая от нуля справа), берём https://www.cyberforum.ru/cgi-bin/latex.cgi?2^i (как раз таки d), получаем число с единственным единичным разрядом в i-м разряде, потом операция & (поразрядное И) — результат равен либо не равен нулю, если в числе на этой позиции 0 либо 1 соответственно.
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
20.10.2016, 07:48  [ТС]
А блин, элементарно же было. Насчет d понял, спасибо.
Но при смене || на && мало что меняется правда...

Добавлено через 34 минуты
Тогда вопрос почему цикл по сопоставлению разрядов в Can() начинается с 1 а не с 0?
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
20.10.2016, 10:09
Цитата Сообщение от Serg4356 Посмотреть сообщение
Тогда вопрос
О! Вопрос, кстати, логичный.
Точнее говоря, подозреваю, ответ на именно его простой: в java массивы стандартно нумеруются с единицы, в отличие от Цэ. Уточняю: это предположение; как там в java — не знаю.
А вот возводить в степень надо таки с нулевой! Попробуй в строке 27 поставить (i-1) вместо i.
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
20.10.2016, 11:43  [ТС]
На java тоже с 0 нумеруются.

Попробовал с 0 начать: Can(0, 3, 4) = false.
Если в 27 строке поставить i-1 - решение для n=2: 1|3|7|14|26...

Вобщем не помогло, хотя так правильно.

Седня вечером попробую еще раз свой вариант написать, теперь хоть понимаю некоторые хитрости
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
20.10.2016, 14:49
Хм. Эдак я, кажись, скоро сам попробую...
Цитата Сообщение от Serg4356 Посмотреть сообщение
Can(0, 3, 4) = false
Ну очень странно. Мож, попробовать отладочных печатей понаставить? После 27 как минимум — k, l, d, k&d, l&d.
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
20.10.2016, 20:22  [ТС]
Чел на stackoverflow ответил:
ru|stackoverflow|com/questions/580611/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0-%D0%BE-%D0%BF%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0% B5/580636?noredirect=1#comment771672_580636

+ написал код на плюсах вроде. Может кому поможет
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
21.10.2016, 20:29
Хм. Написал таки. Насчёт 37 строки, оказывается, соврал: там и правда ||. Вот программа, попробуй сравнить. Java у меня, правда, нет, я для таких случаев пользую TCL, но, думаю, разберёшься.
Кликните здесь для просмотра всего текста
Python
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
# k,l -номера сечений, h - количество анализируемых разрядов сечений
proc Can {k l h} {
  set last [expr 1 << $h]
  set b 0
  for {set pos 1} {$pos != $last} {set pos [expr $pos << 1]} {
    if {!($k & $pos)} {
      if {!($l & $pos)} {set b [expr !$b]} {if {$b} {return 0}}
    } elseif {($l & $pos) || $b} {
      return 0
    }
  }
  return [expr !$b]
}
 
proc Solve {w h} {
  set hh [expr (1 << $h) - 1]
  set arr(0,0) 1; for {set i 1} {$i <= $hh} {incr i} {set arr($i,0) 0}
  for {set j 1} {$j <= $w} {incr j} {
    for {set k 0} {$k <= $hh} {incr k} {
      set arr($k,$j) 0
      set descr {}
      for {set l 0} {$l <= $hh} {incr l} {
        if {[Can $l $k $h]} {
          append descr "+$arr($l,[expr $j-1]) ($l,[expr $j-1])"
          incr arr($k,$j) $arr($l,[expr $j-1])
        }
      }
      puts "$k,$j: $arr($k,$j) = $descr"
    }
  }
}
 
Solve 10 2
Остаётся одна гипотеза: где-то не всё в порядке с краями — границами for. Вот протокол моей:
Python
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
fat@localhost ~ $ tclsh parket.tcl 
0,1: 1 = +1 (0,0)+0 (3,0)
1,1: 0 = +0 (2,0)
2,1: 0 = +0 (1,0)
3,1: 1 = +1 (0,0)
0,2: 2 = +1 (0,1)+1 (3,1)
1,2: 0 = +0 (2,1)
2,2: 0 = +0 (1,1)
3,2: 1 = +1 (0,1)
0,3: 3 = +2 (0,2)+1 (3,2)
1,3: 0 = +0 (2,2)
2,3: 0 = +0 (1,2)
3,3: 2 = +2 (0,2)
0,4: 5 = +3 (0,3)+2 (3,3)
1,4: 0 = +0 (2,3)
2,4: 0 = +0 (1,3)
3,4: 3 = +3 (0,3)
0,5: 8 = +5 (0,4)+3 (3,4)
1,5: 0 = +0 (2,4)
2,5: 0 = +0 (1,4)
3,5: 5 = +5 (0,4)
0,6: 13 = +8 (0,5)+5 (3,5)
1,6: 0 = +0 (2,5)
2,6: 0 = +0 (1,5)
3,6: 8 = +8 (0,5)
0,7: 21 = +13 (0,6)+8 (3,6)
1,7: 0 = +0 (2,6)
2,7: 0 = +0 (1,6)
3,7: 13 = +13 (0,6)
0,8: 34 = +21 (0,7)+13 (3,7)
1,8: 0 = +0 (2,7)
2,8: 0 = +0 (1,7)
3,8: 21 = +21 (0,7)
0,9: 55 = +34 (0,8)+21 (3,8)
1,9: 0 = +0 (2,8)
2,9: 0 = +0 (1,8)
3,9: 34 = +34 (0,8)
0,10: 89 = +55 (0,9)+34 (3,9)
1,10: 0 = +0 (2,9)
2,10: 0 = +0 (1,9)
3,10: 55 = +55 (0,9)
Если что, выложи свой аналогичный. Погляжу.
1
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
24.10.2016, 10:51  [ТС]
Цитата Сообщение от iifat Посмотреть сообщение
но, думаю, разберёшься.
Блин насчет кодов на другом языке - я пасс. Как бы сам студент заочник, и примерно полгода пытаюсь что то там на джаве изобразить с горем пополам. Очень хотелось бы сделать вид что я свой чувак в программировании, но пока рановато. Еще не на скилле)
Ну вот полностью мой код:

Кликните здесь для просмотра всего текста
Java
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
import java.util.ArrayList;
 
public class Parquet{
 
    // метод для сопоставления сечений
    public static boolean acceptCut(int firstCut, int secondCut, int digitsCount){
        int countSecond = 0;// переменная для хранения кол-ва 0 во втором сечении
 
        for(int i=0;i<digitsCount;i++){//цикл по каждому разряду сечения
            int digit = (1<<i);// маска
            if((firstCut&digit)==0) {//если i-ый разряд 1-го сечения =0
                    if ((secondCut & digit) == 0) {//если i-ый разряд 2-го сечения =0
                        countSecond++;
                        } else {//если i-ый разряд 2-го сечения !=0
                            if(countSecond%2!=0) return false;// и кол-во 0 во втором сечении - нечетно
                        }
                } else {//если i-ый разряд 1-го сечения !=0
                    if ((secondCut & digit)!=0) return false; // (countSecond%2!=0)|| и кол-во 0 во втором сечении - нечетно
                }
            }
            if((countSecond%2!=0)) return false;//(countFirst%2!=0)||
        return true;
    }
 
    //метод для нахождения решений для заданных m n
    public static String countValues(int digitsCount, int roomWidth){
    ArrayList resArray = new ArrayList();
    ArrayList resArray2 = new ArrayList();
        String res ="0", res2="";
    long resNumber = 0;
    int maxi = 1<<digitsCount;
    int maxy= 1<<digitsCount;
 
    if(digitsCount*roomWidth%2!=0) return "*";
 
    //устанавливаем первоначальные значания для resArray
    resArray.add(0);
    //используем значения из resArray перебираем подходящие
  outer: for(int i=0; i<roomWidth;i++) {
         for (int x = 0; x < maxy; x++) {//resArray.size()     res.length()  тут использую лист для сохранения подходящих значений
 
             if (i == (roomWidth - 1)) maxi = 1;
 
             for (int z = 0; z < maxi; z++) {
                 if (acceptCut(x, z, digitsCount)) {//(Integer) resArray.get(x) |||| acceptCut(Integer.parseInt(Character.toString(res.charAt(x)))
                     System.out.println(x + "|" + fullString(x, digitsCount)
                      + "|" + z + "|" + fullString(z, digitsCount) );
                    /**
                     resArray2.add(z);
                     res2 += z;
                      */
                     if (i == (roomWidth - 1)) {
                         resNumber++;
                     }
                 }
             }
             if(i==0) continue outer;
         }
         /**
          resArray.clear();
          for (int x = 0; x < resArray2.size(); x++) {
          resArray.add(resArray2.get(x));
          }
          resArray2.clear();
 
 
         res = res2;
         res2 = "";
        */
     }
    return Long.toString(resNumber);
    }
 
 
 
    public static void main(String[] args) {
     // System.out.println(fullString(3,4));
        /**
        for(int i = 1; i<=20; i++) {
            System.out.println(countValues(i, 2) + "|" + countValues(2, i) + "|");
        }
*/
     // System.out.println(countValues(3,2));
        System.out.println(acceptCut(2,0,3));
        System.out.println(acceptCut(0,2,3));
    }
}

он вроде как бы работает, но как бы и не знаю. Тут использовал ArrayList для сохранения правых сечений, чтобы потом сравнивать с левыми(в данный момент закомментил, т.к. пытался через логику и перебор делать). Объясню почему. Если мы сравниваем правое сечение с левым с помощью перебора то вполне вероятна такая ситуация: acceptCut(2,0,3) = true (что не корректно), и с текущей логикой acceptCut(0,2,3) = false (что корректно). Соответственно если левые сечения не проверяются а сохраняются из правых и потом используются - такой ошибки не возникает.

Как засунуть это в логику я не понимаю. Есть ситуации когда сечение может начинаться с 01 например для случаев (33, 18, 6) (как на картинке - сечение 3), а есть ситуации когда не может - например (0,2,3). И я хоть и с трудом понимаю ваш код (и парня со стэковерфлоу) но не замечаю таких заглушек-исключений на несколько строк в сравнении сечений, и кароче опять не догоняю.

Вроде бы способ с сохранением правых значений и использованием их потом как левых работает, но я не знаю куда сохранять корректные значения. ArrayList при m=20 n=8 загибается с Java heap space, при меньших значениях заметно долго думает. Да и вообще брутфорс же) не элегантно ни разу.

Вот можете мне объяснить при сопоставлении двух сечений они генерятся? и какая там логика в приведенном выше случае

З.Ы. Прошу прощения за закоменченные куски кода, они вроде как нужны для понимания значения ArrayList
0
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
24.10.2016, 10:57  [ТС]
Картинка
Изображения
 
0
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
25.10.2016, 08:35
Цитата Сообщение от Serg4356 Посмотреть сообщение
при сопоставлении двух сечений они генерятся?
Они не генерятся, муторно это. Они проверяются подряд, все со всеми.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2016, 08:35
Помогаю со студенческими работами здесь

Клетчатая доска - Определить количество способов добраться до последней клетки N-M
Привет. Задача такая: дана клетчатая доска NxM (-1000 &lt;= N,M &lt;= 1000), мы находимся в самой первой клетке 1-1. Нужно определить количество...

Определить количество способов составления числа с помощью цифр из диапазонов
Задача такое, дано два диапазона а-b и с-d, данное количество чесел, и сами числа, и надо определить количество способов составления числа...

Рекурсия: определить количество способов, которыми можно расставить n книг на полке
1)Составить программу решения задачи: определить количество способов, которыми можно расставить n книг на полки, программа должна...

Определить схему расположения укладки рядов и необходимое кол-во (расход) плит
Прямоугольная поверхность размером a x b покрывается настилом квадратного сечения с х с и d x d . Настил укладывается рядами 1-го размера...

Определить количество способов оплаты N рублей с помощью монет достоинством 1, 2, 5, 10 рублей
Дано натуральное число N (N&lt;100). Определить количество способов оплаты N рублей с помощью монет достоинством 1, 2, 5, 10 рублей....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru