Exemplo n.º 1
0
void
generateBacktrack(IntVector& current_set, unsigned n)
{
	unsigned csum = std::accumulate(current_set.begin(), current_set.end(), 0);
	if (csum > n)
	{
		//discard this solution
		return;
	}
	
	
	if (csum == n)		//if solution, print it
	{
		processSolution(current_set);
	}
	else
	{
		IntVector candidates = getCandidates(current_set, n, csum);
		for (unsigned i =0; i < candidates.size(); ++i)
		{
			current_set.push_back(candidates.at(i));
			generateBacktrack(current_set, n);
			current_set.pop_back();
		}
	}
}
Exemplo n.º 2
0
void testPop_Back(IntVector& test)
{
	for (int i = 0; i < 3; i++)
	{
		test.pop_back();
		cout << "Popback" << endl;
		testValues(test);
	}
}
void baseReqTests(IntVector& intVector) {
	assert(intVector.empty());
	assert(intVector.size() == 0);

	// Insert 20 things into the vector
	for (int i = 0; i < 20; i++) {
		intVector.push_back(i);
	}

	// Make sure vector is no longer empty
	assert(!intVector.empty());

	// Make sure there is exactly 20 things in vector
	assert(intVector.size() == 20);

	// Make sure things are in the right place
	assert(intVector.at(0) == 0);
	assert(intVector.at(5) == 5);
	assert(intVector.at(15) == 15);
	assert(intVector.at(19) == 19);

	// Let's pop something
	assert(intVector.pop_back() == 19);
	assert(intVector.size() == 19);
	try {
		intVector.at(19);
	}
	catch (int e) {
		assert(true);
	}

	// Let's pop everything
	int old = 19;
	while (!intVector.empty()) {
		int temp = intVector.pop_back();
		assert(temp == old - 1);
		old = temp;
	}

}
Exemplo n.º 4
0
void
generateBacktrack(IntVector& current_set, unsigned n)
{
	if (current_set.size() == n)		//if solution, print it
	{
		processSolution(current_set);
	}
	else
	{
		IntVector candidates;
		candidates.push_back(0);
		candidates.push_back(1);
		for (unsigned i =0; i < candidates.size(); ++i)
		{
			current_set.push_back(candidates.at(i));
			generateBacktrack(current_set, n);
			current_set.pop_back();
		}
	}
}
Exemplo n.º 5
0
bool MSProductParameters::getSequenceElements ( ParameterList* params, const string& num, string& sequence, string& nTermName, string& cTermName, string& neutralLossName )
{
	sequence = params->getStrippedStringValue ( "sequence" + num, "" );
	if ( sequence.empty () ) return false;
	nTermName = params->getStringValue ( "nterm" + num, "" );
	cTermName = params->getStringValue ( "cterm" + num, "" );
	neutralLossName = params->getStringValue ( "nloss" + num, "" );
	if ( nTermName.empty () && cTermName.empty () && neutralLossName.empty () ) {
		static StringVector nTermNames = ConstMod::getNTermNames ();
		static StringVector cTermNames = ConstMod::getCTermNames ();
		static StringVector nLossNames = ConstMod::getNLossNames ();
		IntVector plusIdx;
		IntVector minusIdx;
		for ( StringSizeType i = 0 ; i < sequence.length () ; i++ ) {
			char p = sequence [i];
			if ( p == '+' )		plusIdx.push_back ( i );
			else if ( p == '-' )minusIdx.push_back ( i );
			else if ( p == '(' ) {
				int bracket = 0;
				for ( ; i < sequence.length () ; i++ ) {
					char a = sequence [i];
					if ( a == '(' ) bracket++;
					if ( a == ')' ) bracket--;
					if ( bracket == 0 ) break;
				}
			}
		}
		if ( !plusIdx.empty () ) {
			for ( int i = 0 ; i < nLossNames.size () ; i++ ) {
				string nL = nLossNames [i];
				if ( isSuffix ( sequence, "+" + nL ) ) {
					sequence = sequence.substr ( 0, sequence.length () - 1 - nL.length () );
					neutralLossName = nL;
					break;
				}
			}
			if ( neutralLossName.empty () ) {
				string possNLoss = sequence.substr ( plusIdx.back () + 1 );	// Add 1 to the last +
				if ( genStringIsFloat ( possNLoss ) ) {						// Check if number
					sequence = sequence.substr ( 0, plusIdx.back () );
					neutralLossName = possNLoss;
				}
			}
			while ( !minusIdx.empty () && minusIdx.back () >= sequence.length () ) minusIdx.pop_back ();
		}
		if ( !minusIdx.empty () ) {
			for ( int i = 0 ; i < cTermNames.size () ; i++ ) {
				string nC = cTermNames [i];
				if ( nC.empty () ) continue;
				if ( isSuffix ( sequence, "-" + nC ) ) {
					sequence = sequence.substr ( 0, sequence.length () - 1 - nC.length () );
					cTermName = nC;
					break;
				}
			}
			if ( cTermName.empty () ) {
				int idx = minusIdx.back ();
				if ( sequence [idx-1] != '-' ) idx += 1;
				string possCTerm = sequence.substr ( idx );	// Add 1 to the last -
				if ( genStringIsFloat ( possCTerm ) ) {							// Check if number
					sequence = sequence.substr ( 0, idx - 1 );
					cTermName = possCTerm;
				}
			}
			while ( minusIdx.back () >= sequence.length () ) minusIdx.pop_back ();
		}
		if ( !minusIdx.empty () ) {
			for ( int j = 0 ; j < nTermNames.size () ; j++ ) {
				string nN = nTermNames [j];
				if ( nN.empty () ) continue;
				if ( isPrefix ( sequence, nN + "-" ) ) {
					sequence = sequence.substr ( nN.length () + 1 );
					nTermName = nN;
					break;
				}
			}
			if ( nTermName.empty () ) {
				int idx = ( sequence [0] == '-' ) ? minusIdx [1] : minusIdx [0];
				string possNTerm = sequence.substr ( 0, idx );
				if ( genStringIsFloat ( possNTerm ) ) {							// Check if number
					sequence = sequence.substr ( idx + 1 );
					nTermName = possNTerm;
				}
			}
		}
		params->addOrReplaceName ( "sequence" + num, sequence );
		params->addOrReplaceName ( "nterm" + num, nTermName );
		params->addOrReplaceName ( "cterm" + num, cTermName );
		params->addOrReplaceName ( "nloss" + num, neutralLossName );
	}
	return true;
}