The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"помогите с алгоритмом"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"помогите с алгоритмом"  +/
Сообщение от konst email(??) on 03-Дек-11, 03:59 
Решил от нечего делать набросать скриптик (за 10-15 мин.), облегчающий жизнь разгадывателям судоку.

В итоге 2 ночи не могу решить вроде бы простенькую задачу.  Суть:
показать все возможные комбинации цифр (1..9), чья сумма == заданной.
Напр.: какие 3 уникальные цифры составляют в сумме "23"? Ответ: "689"
Напр.: какие 2 уникальные цифры составляют в сумме "6"? Ответ: "15","24"

скрипту передается 3 параметра:
1) требуемая сумма.
2) кол-во используемых цифр.
3) список цифр, которые нельзя использовать. (через запятую)
Напр.: script.pl 33 6 7,8 = какая комбинация неповторяющихся "6" цифр составляет сумму "33", если известно, что среди них нет "7 и 8"?

#!/usr/bin/perl

@p = @ARGV;;
$sum = int $p[0]; # требуемая сумма
$n = int $p[1]; # кол-во цифр для суммы
$not =  $p[2]; # 3-й параметр - через запятую перечисляются неиспользуемые цифры
@not = split(',',$not);
foreach $not (@not) { $not{$not} =1; }
# сделали %not - там ключи=цифры, которые нельзя использовать при составлении суммы.
-----
а дальше?
А вот что дальше?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "помогите с алгоритмом"  +/
Сообщение от konst email(??) on 03-Дек-11, 04:32 
> А вот что дальше?

Есть ли решение, чтобы просто вывести комбинации цифр (без сравнения: на сумму, на повторяющиеся цифры): просто набор: напр. все комбинации из 3-х цифр:
111
112
113
...
121
122
...
211
212
213
...
Я даже этого счас не могу осилить....

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "помогите с алгоритмом"  +/
Сообщение от Etch on 03-Дек-11, 12:42 
#!/usr/bin/perl

@p = @ARGV;;
$sum = int $p[0]; # требуемая сумма
$n = int $p[1]; # кол-во цифр для суммы
$not =  $p[2]; # 3-й параметр - через запятую перечисляются неиспользуемые цифры
@not = split(',',$not);
foreach $not (@not) { $not{$not} =1; }
# сделали %not - там ключи=цифры, которые нельзя использовать при составлении суммы.
#-----

sub sudoku {
    my $start = shift;
    my $_numbers = shift; #найденные цифры
    my $_current_sum = shift; #сумма найденных цифр
    my $n = shift; #кол-во оставшихся цифр
    
    for (my $i=$start; $i<10; $i++)
    {
        next if $not{$i} == 1;
        if ($n > 1) { sudoku($i + 1, join('', ($_numbers, $i)), $_current_sum + $i, $n - 1); }
        elsif ($_current_sum + $i == $sum) { print "${_numbers}${i}\n"; }
    }
}

sudoku(1, '', 0, $n, $not);

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "помогите с алгоритмом"  +/
Сообщение от konst email(??) on 03-Дек-11, 22:52 
СПАСИБО!!!!!!!
Внес только такие изменения:
-for (my $i=$start; $i<10; $i++)
+for my $i ($start..9)

-next if $not{$i} == 1;
+next if $not{$i};# == 1; красивее так (imho): $not{$i} && next;

СПАСИБО!!!!!!!

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру