Реализация алгоритма для поиска обьекта
Всем привет.
Я не силен в алгаритмах, но вот тут возникла проблемка, надо код который работает но с ошибками (да еще и с go to) переделать на нормальный человеческий вид.
Его принцип такой что надо ходить в цикле по обьектам пока не найдем тот который нужно. Движение в направлениях только вверх и вниз.
Ниже привожу кусок кода что является тем который работает но требует как в песне перемен.
QQuickItem * Stack::find(StackItem item, Stack::Direction direction) { QQuickItem *res = nullptr; QQuickItem *itemPage = item.page; QQuickItem *itemFocus = item.focus; QList<QQuickItem *> list; // siblings QQuickItem *itemPrev; QQuickItem *itemNext; // parent, next int i; int i = -1; if(itemFocus) itemPrev = qobject_cast<QQuickItem *>(itemFocus->parent()); else itemPrev = itemPage; if(!itemPrev) return nullptr; list = childrenOf(itemPrev); if(itemFocus) i = list.indexOf(itemFocus); try_another: if(direction == Direction::Up && list.length() > i+1) i++; else if(direction == Direction::Down && i > 0) i--; else { itemNext = itemPrev; itemPrev = qobject_cast<QQuickItem *>(qobject_cast<QQuickItem *>(itemPrev)->parent()); if(itemPrev) { if(itemNext == itemPage) return nullptr; list = childrenOf(itemPrev); i = list.indexOf(itemNext); goto try_another; } else return nullptr; } deeper: if(i < 0 || i > (list.length()-1)) { qDebug() << "fuck invalid index, parent" << itemPrev << i; return nullptr; } itemNext = list[i]; if(itemNext->isVisible() && itemNext->isEnabled()) { if(isEnabledOn(itemNext)) { res = itemNext; goto result; } else { if(childrenOf(itemNext).count()) { if(direction == Direction::Down) i = 0; else i = childrenOf(itemNext).count()-1; itemPrev = itemNext; list = childrenOf(itemPrev); goto deeper; } goto try_another; } } else goto try_another; result: return res; }
А вот так выглядит часть начатой реализации в которой как раз есть нужные циклы за счет которых будет происходить поиск. То есть то что выше в коде надо в правильном порядке чтоли перетащить сюда.
QQuickItem *res = nullptr; QQuickItem *itemPage = item.page; QQuickItem *itemFocus = item.focus; QList<QQuickItem *> list; // siblings QQuickItem *itemPrev; QQuickItem *itemNext; // parent, next int i; int i = -1; if(itemFocus) itemPrev = itemFocus->parentItem(); else itemPrev = itemPage; if(!itemPrev) return nullptr; list = childrenOf(itemPrev); if(itemFocus) i = list.indexOf(itemFocus); list = childrenOf(itemFocus->parentItem()); bool found = false; while (!found) // TODO: if not found { if(direction == Direction::Down) { // TODO: если индекс карента не последний while () // TODO: if last { // visible and enabled } } else if(direction == Direction::Up) { while () // TODO: if first { // visible and enabled } } } return res;
Так же я думаю важным отличием от кода с go to и на что надо переписать так это несколько переменных что будут помогать в поиске. first, last, direction, childre(yes, no)
И прикрепляю файлик с самим алгаритмом. В нем расмотренны все варианты. И само представленеи обьектов по которым происходит поиск.
Дерево
Алгоритм
Надеюсь кто то сможет с этим помочь.
Спасибо.
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 12 листопада 2024 р. 01:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 11:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 11:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10