Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
НемецкийКот
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 30
1

Нужен алгоритм перебора всех вариантов кодового замка

29.11.2018, 09:08. Просмотров 1067. Ответов 11

Не могу найти такой алгоритм в гугле и не могу придумать сам. Помогите!! Есть кодовый замок такого плана :
https://www.google.ru/url?sa=i&sourc...43557777277252
Нужно вывести все возможные варианты его кодов.
В ближайшие два дня нужно найти этот алгоритм.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2018, 09:08
Ответы с готовыми решениями:

Алгоритм перебора всех возможных значений
Здравствуйте, суть задачи алгоритма состоит в поиске всех возможных сочетаний букв в слове....

Нужен совет по усовершенствованию кодового замка :)
Здравствуйте. Заранее прошу прощения, если сейчас сморожу какую-то глупость - я не специально. На...

Алгоритм перебора вариантов
Кто нибудь может подсказать эффективный алгоритм без рекурсии желательно: на входе есть массив...

Алгоритм полного перебора вариантов
Создать алгоритм полного перебора вариантов определенного количества символов...

питание кодового замка
насколько надежна эта схема в плане пожарной безопасности(на постоянную работу)? или есть...

11
Avaddon74
483 / 304 / 119
Регистрация: 15.09.2017
Сообщений: 1,051
29.11.2018, 09:20 2
А что там перебирать? там всего-то 10000 комбинаций, начал с 1 и попер перебирать, какой ещё алгоритм?
0
НемецкийКот
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 30
29.11.2018, 13:41  [ТС] 3
Это понятно, что там 10000 комбинаций, но как их вывести все без повторений? Этот замок я просто для примера прислал.
Могут же быть любые размеры. Нужен универсальный алгоритм.
0
Avaddon74
483 / 304 / 119
Регистрация: 15.09.2017
Сообщений: 1,051
29.11.2018, 13:49 4
C++
1
for(int i = 0; i < n; i++) cout << i << ' ';
где n - кол-во комбинаций
1
29.11.2018, 13:49
Джон Кофи
73 / 12 / 2
Регистрация: 05.04.2018
Сообщений: 348
Завершенные тесты: 2
29.11.2018, 14:20 5
НемецкийКот,
вложенные циклы. 1 цикл = 1 размер кода. Те если код == 231205; то будет 6 циклов.
каждую итерацию цикла записывай, например, в вектор. В последнем цикле условием посмотри- совпадает ли значения вектора с кодом, если нет, то цикл продолжается дальше. И так, пока не будут перебраны все варианты.
Но это если тебе прям аналогия работы этого замка с ссылки нужна. А так проще, конечно проверять одним циклом, как тебе выше написали.
Если же заранее неизвестен размер кода, те ты не знаешь это 3х значное число или неск триллионов , то сделай цикл от 0 до самого большого значения допустимого С++.
0
НемецкийКот
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 30
29.11.2018, 22:11  [ТС] 6
Вы неправильно меня поняли. Нужно не найти код, а вывести все вариации возможных кодов для любого размера. То-есть
вводится количество звеньев и цифр в каждом. Например, в данном замке нужно вывести все 10000 вариаций.
0
Fulcrum_013
1482 / 1210 / 141
Регистрация: 14.12.2014
Сообщений: 10,465
Завершенные тесты: 3
29.11.2018, 22:15 7
Цитата Сообщение от НемецкийКот Посмотреть сообщение
Например, в данном замке нужно вывести все 10000 вариаций.
ну это все числа от 0 до 9999 с лидирующими нулями.
0
lArtl
308 / 164 / 73
Регистрация: 09.10.2014
Сообщений: 766
Завершенные тесты: 3
29.11.2018, 22:19 8
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <iomanip>
 
int main()
{
    std::cout << std::setfill('0');
    for(int i = 0; i < 10000; ++i){
        std::cout << std::setw(4) << i << std::endl;
    }
}
0
Avaddon74
483 / 304 / 119
Регистрация: 15.09.2017
Сообщений: 1,051
30.11.2018, 11:17 9
Лучший ответ Сообщение было отмечено НемецкийКот как решение

Решение

Цитата Сообщение от НемецкийКот Посмотреть сообщение
Вы неправильно меня поняли. Нужно не найти код, а вывести все вариации возможных кодов для любого размера
Так?
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
ofstream file;
const char symbols[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c'};  // символы которые может содержать пароль
const int maxNum = 4;           // кол-во символов в пароле
const char fileName[] = "pass.txt";     // имя файла для вывода
 
void print(int count, string str = "") {
    for (int i = 0; symbols[i]; i++) {
        string temp(str);
        temp += symbols[i];
        if (count > 1) print(count - 1, temp);
        else file << temp << ' ';
    }
}
 
int main(){
    file.open(fileName);
    if (file.is_open()) {
        print(maxNum);
    }
    file.close();
    return 0;
}
Добавлено через 11 часов 42 минуты
7-ю строку замените на это
C++
1
const char symbols[] = "0123456789abcdef";
, корректней будет работать, в первом варианте иногда будут возникать не верные варианты
1
повар1
289 / 224 / 173
Регистрация: 24.02.2017
Сообщений: 855
Завершенные тесты: 1
30.11.2018, 12:59 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 int n,i=0,j=0,count=0;//n -размер
 
     cin>>n;
     cout << std::setfill('0');
     while(count<pow(10,(double)n-1)){
        cout << std::setw(n) << i << std::endl;
        i++;
        j++;
        if(j>9){
          j=0;
          count++;
         }
        }
0
НемецкийКот
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 30
30.11.2018, 20:13  [ТС] 11
Спасибо, Avaddon74. Я немного усовершенствовал алгоритм. Можно задавать любые векторы значений и он будет работать.
Есть куда улучшать, но я делал на скорую руку.
Если использовать разные размеры изредка выдаёт повторения, но незначительною Есть идеи как это исправить?
Конкрето : после всех вариаций каждой цифры из первого столбца выводится несколько дубликатов. Их нет , если размеры всех столбцов равны.



Вот код :

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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
vector<vector<int>> vvod{ {1,2,3,4},{3,2,6,8,8},{4, 2}};
 
void perebor(vector<int> number, vector<vector<int>> iv = vvod, int count = vvod.size())
{
    for (size_t j = 0; j < iv[0].size(); ++j)
    {
        auto temp = number;
        temp.push_back(iv[0][j]);
        if (count > 1)
        {
            perebor(temp , vector<vector<int>>(++iv.begin(), iv.end()), count - 1);
        }
        else
        {
            for (auto &c : temp)
                cout << c;
            cout << endl;
        }
    }
}
 
 
 
 
int main()
{
    vector<int> a;
    perebor(a);
}
0
Avaddon74
483 / 304 / 119
Регистрация: 15.09.2017
Сообщений: 1,051
01.12.2018, 09:32 12
Цитата Сообщение от НемецкийКот Посмотреть сообщение
{1,2,3,4},{3,2,6,8,8},{4, 2}}
Зачем так? разве такое встречается? особенно две восьмерки
Я понимаю что, например, первая колонка буквы, а дальше цифры, но так...
0
01.12.2018, 09:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2018, 09:32

Создание кодового замка.
Здравствуйте. Есть задание &quot;Создать кодовый замок при помощи VCL&quot;. Использую C++ Builder 2010....

Схема кодового замка с последовательным вводом пароля
Здравствуйте. нужно собрать схему в аплете Circuit Simulator, схему кодового замка с...

Программное обеспечение встроенного микропроцессора кодового замка
Здравствуйте, уважаемые форумчане. Имеется по C#Window Forms следующее задание: Требуется...


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

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

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