/****************************************
 * Fonction qui tente de propager un elem
 * sur toute la diagonale
 ***************************************/
inline int Propager(int diag, int val)
{
	/* Variables */
	int lig, t;
	
	/* On place val en haut de la diagonale */
	SetValueAt(val, 1, diag);

	/* Cas trivial */
	if(diag == 1) return TRUE;

	/* On essaie de propager sur la diagonale */
	for(lig = 2; lig <= diag; lig++)
	{
		val = abs(ValueAt(lig-1, diag-1) - ValueAt(lig-1, diag));
		if(Contains(val, lig, diag))
			return FALSE;
		else
		{
			/* On place l'element */
			SetValueAt(val, lig, diag);

			/* Maintien de la liste des places */
			/*
			t = Indice(lig, diag);
			if(progres < t) progres = t+1;
			*/
		}
	}
	/* On a reussi a propager jusqu'en bas */
	return TRUE;
}
Example #2
0
void
SudokuField::_ComputeValidMask(uint32 x, uint32 y, bool setSolved)
{
	if (ValueAt(x, y))
		return;

	// check row

	uint32 foundMask = 0;
	for (uint32 i = 0; i < fSize; i++) {
		uint32 value = ValueAt(i, y);
		if (value && _ValidValueAt(i, y))
			foundMask |= 1UL << (value - 1);
	}

	// check column

	for (uint32 i = 0; i < fSize; i++) {
		uint32 value = ValueAt(x, i);
		if (value && _ValidValueAt(x, i))
			foundMask |= 1UL << (value - 1);
	}

	// check block

	uint32 offsetX = x / fBlockSize * fBlockSize;
	uint32 offsetY = y / fBlockSize * fBlockSize;

	for (uint32 partY = 0; partY < fBlockSize; partY++) {
		for (uint32 partX = 0; partX < fBlockSize; partX++) {
			uint32 value = ValueAt(partX + offsetX, partY + offsetY);
			if (value && _ValidValueAt(partX + offsetX, partY + offsetY))
				foundMask |= 1UL << (value - 1);
		}
	}

	SetValidMaskAt(x, y, ~foundMask);

	if (setSolved) {
		// find the one set bit, if not more
		uint32 value = 0;
		for (uint32 i = 0; i < fSize; i++) {
			if ((foundMask & (1UL << i)) == 0) {
				if (value != 0) {
					value = 0;
					break;
				}

				value = i + 1;
			}
		}
		if (value != 0)
			SetValueAt(x, y, value, true);
	}
}
/****************************************
 * Procedure qui remplit la pyramide
 * de facon correcte
 ***************************************/
void Remplir(int valeur)
{
	/* On mémorise l'instant de début */
	start = time(NULL);
	/* On met la valeur dans la première case */
	SetValueAt(valeur, 1, 1);
	/* On commence par la deuxième diagonale */
	RemplirH(2);
	/* On mémorise l'instant de fin */
	stop = time(NULL);
}
Example #4
0
void ImageTile::AddBaseline(Image2D &dest, double sign)
{
	// Add or subtract baseline
	for(unsigned channel = 0;channel<_channelCount;++channel) {
		for(unsigned scan = 0;scan<_scanCount;++scan) {
			long double val = dest.Value(scan+_scanOffset, channel+_channelOffset);
			val += sign * EvaluateBaselineFunction(scan, channel);
			SetValueAt(dest, channel, scan, val);
		}
	}
}
Example #5
0
void VJSArray::PushValue( const VJSValue& inValue, JS4D::ExceptionRef *outException) const
{
	SetValueAt( GetLength(), inValue, outException);
}