char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) { if( !isNumeric( *in ) && !isCharacter( *in ) ) { ++in; } in = lookForNextToken( in, end ); Value::ValueType type( Value::ddl_none ); size_t arrayLen( 0 ); in = OpenDDLParser::parsePrimitiveDataType( in, end, type, arrayLen ); if( Value::ddl_none != type ) { // parse a primitive data type in = lookForNextToken( in, end ); if( *in == Grammar::OpenBracketToken[ 0 ] ) { Reference *refs( ddl_nullptr ); DataArrayList *dtArrayList( ddl_nullptr ); Value *values( ddl_nullptr ); if( 1 == arrayLen ) { size_t numRefs( 0 ), numValues( 0 ); in = parseDataList( in, end, type, &values, numValues, &refs, numRefs ); setNodeValues( top(), values ); setNodeReferences( top(), refs ); } else if( arrayLen > 1 ) { in = parseDataArrayList( in, end, type, &dtArrayList ); setNodeDataArrayList( top(), dtArrayList ); } else { std::cerr << "0 for array is invalid." << std::endl; error = true; } } in = lookForNextToken( in, end ); if( *in != '}' ) { logInvalidTokenError( in, std::string( Grammar::CloseBracketToken ), m_logCallback ); return ddl_nullptr; } else { //in++; } } else { // parse a complex data type in = parseNextNode( in, end ); } return in; }
void astar(TreeNode &root) { t_astar var; var.children = NULL; var.success = false; var.success2 = false; normalized2(*root.getState()); TreeNode end(all.finalsnail); end.StateToStr(); setNodeValues(end); end.setParent(NULL); root.StateToStr(); var.pq_end.push(&end); var.opened_end.insert({end.getStringedState(), &end}); while (!var.success2) { var.e = var.pq_end.top(); var.e->StateToStr(); if (var.e->getDepth() > 11 || var.e->getStringedState() == root.getStringedState()) { var.success2 = true; } else { var.pq_end.pop(); var.e->setChildren(var.e->up(), 0); var.e->setChildren(var.e->down(), 1); var.e->setChildren(var.e->right(), 2); var.e->setChildren(var.e->left(), 3); var.closed_end.insert({var.e->getStringedState(), var.e}); var.children = (TreeNode **) var.e->getChildren(); if (var.children[0] != NULL) { astar3(var, 0); } if (var.children[1] != NULL) { astar3(var, 1); } if (var.children[2] != NULL){ astar3(var, 2); } if (var.children[3] != NULL) { astar3(var, 3); } } } setNodeValues(root); var.pq.push(&root); var.opened.insert({root.getStringedState(), (&root)}); while (!var.success && !var.pq.empty()) { var.e = var.pq.top(); var.e->StateToStr(); if (var.e->getStringedState() == end.getStringedState()) { var.e->printree(); std::cout<<"complexity_time / "<<all.complexity_time<<std::endl; std::cout<<"complexity_size / "<<var.closed.size() + var.closed_end.size()<<std::endl; std::cout<<all.nb_moves<<"nb_moves"<<std::endl; var.success = true; continue; } else { var.pq.pop(); var.closed.insert({var.e->getStringedState(), var.e}); var.e->setChildren(var.e->up(), 0); var.e->setChildren(var.e->down(), 1); var.e->setChildren(var.e->right(), 2); var.e->setChildren(var.e->left(), 3); var.children = (TreeNode **) var.e->getChildren(); if (var.children[0] != NULL) { if (astar2(var, 0)) continue ; } if (var.children[1] != NULL) { if (astar2(var, 1)) continue ; } if (var.children[2] != NULL){ if (astar2(var, 2)) continue ; } if (var.children[3] != NULL) { if (astar2(var, 3)) continue ; } } } if (var.pq.empty() && !var.success) std::cout<<"Solution not found!"<<std::endl; }