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

Задача с кубиками - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Эйлеров путь. Нужны комментарии кода http://www.cyberforum.ru/cpp-beginners/thread876509.html
Имеется правильный код решения задачи по поиску Эйлерова пути. Прошу прокомментировать важные аспекты кода, то есть, что выполняет тот или иной цикл и т.п. Заранее благодарен! Условие: Задан неориентированный мультиграф из N вершин и M ребер. Требуется построить в нем эйлеров путь. Входные данные В первой строке через пробел записано два натуральных числа N и M (1 <= N <= 50, 1 <= M <=...
C++ Возврат созданного в функции массива Верна ли следующая конструкция? void LoadArray(float* array, int & count) { int fcount = 30;//данная цифра подсчитывается при открытии файла. count = fcount; array = new float; // дальше загрузка данных в массив. http://www.cyberforum.ru/cpp-beginners/thread876501.html
C++ Проверьте задачку (написать функцию, которая возвращает индекс строки t к строке s, и "-1", если t в s не входит)
Написать функцию, которая возвращает индекс строки t к строке s, и "-1", если t в s не входит. Вот код программы: int stroka(char *s,char *t) {int k=0, n=0; while (*t++==*s++) { n=k; } if(*t++!=*s++) n=-1;
C++ комментарии к программе(желательно построчно)
#include <iostream> using namespace std; #include <iomanip> template <typename T> class Stack { private: T *stackPtr; int size; T top;
C++ Ошибка при создании 2-го элемента динамического списка http://www.cyberforum.ru/cpp-beginners/thread876489.html
НЕ могу понять откуда как исправить данную ошибка . Выскакивает как мне кажется при попытке динамически выделить память для указателя на структуру повторно Node *pv = new Node . Компилировал на DEV -C++ 4.9.9.2 Выбираю 5 пункт меню 1 раз проходит все нормально.Повторный выбор выскакивает ошибка : Инструкция по адресу 0х0... обратилось к памяти по адресу 0х00000048 Память не может быть written....
C++ Найти нужные числа из множества случайных Доброго времени суток! Ребята, помогите, пожалуйста, решить задачу) Изначально задание выглядит так: "Эксперимент состоит из подсчета числа бросков двух костей до выпадения двух шестерок. Провести статистическое исследование среднего числа необходимого для получения двух шестерок, повторяя эксперимент N раз." Последняя задача в курсовой работе (задачи типа "Введите 2 числа и найдите сумму"... подробнее

Показать сообщение отдельно
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
25.05.2013, 15:43     Задача с кубиками
вот мое решение (перебор с возвратом)
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
//http://www.cyberforum.ru/cpp-beginners/thread876533.html
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <unordered_set>
#include <unordered_map>
#include <queue>
//#define DEBUG
 
using namespace std;
 
int main()
{
//входные данные и подготовка
    string sname, chars;
    ifstream file("data.txt");
    file >> sname;
    unordered_map<char, unordered_set<int>> cubes;
    string cube;
    int cube_idx = 0;
    file.get();
         
    while (getline(file, cube)) {
//все неподходящие кубики пропускаем
        if ( any_of( begin(cube), end(cube), [&](char c) { return sname.find(c) != string::npos; } ) )
            for (auto c : cube)
                if ( sname.find(c) != string::npos )
                    cubes[c].insert(cube_idx);
        cube_idx++;
    }
    file.close();
//подготовка завершена, теперь поиск перешния   
    
    vector<queue<int>> q(sname.size(), queue<int>());
    vector<int> path(sname.size(), -1);
 
    #ifdef DEBUG
    for (auto &v : cubes) {
        cout << v.first;
        for (auto i : v.second)
            cout << " " << i;
        cout << endl;
    }
    #endif
 
    for ( auto &x : cubes[sname[0]] )
        q[0].push(x);
    int pos = 0, v;
 
    while (true) {
        v = q[pos].front();
        q[pos].pop();
        path[pos] = v;
 
        if ( pos + 1 == sname.size() ) {
            if (!q[pos].empty()) continue;
            cout << "Path is ";
            for (auto &x : path) cout << x << ' ';
            return 0;
        }
 
        for (auto &x : cubes[ sname[pos + 1] ])
            if ( find( begin(path), end(path), x) == end(path) )
                q[pos + 1].push(x);
 
        if (!q[pos + 1].empty())
            ++pos;
        else {
            while ( q[pos].empty() )
                if (!pos--) return -1;
            fill( begin(path) + pos, end(path), -1 );
        }
    }
    return 0;
}
Первая строчка в файле - это имя, остальные - кубики.
Пример:
ANNJYTBYFT
ANNNNN
BCDEFG
HIJKLM
NOPQRS
KGNYFU
KJBNGU
BYFTYF
HTRSSF
GFJYYU
KJIOJM
LNYIHU
Результат: Path is 0 10 3 9 8 7 5 4 1 6
 
Текущее время: 09:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru