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
|
public Dictionary<int, int> Solve( out int nIterations )
{
// Initialisation depuis les positions d'origine
Dictionary<int, int> positions = new Dictionary<int, int>( _street.InitialPositions );
// Les conflits sont toutes les positions correspondant à au moins 2 vendeurs
Dictionary<int, bool> conflicts = new Dictionary<int, bool>();
foreach ( KeyValuePair<int, int> pair in positions )
if ( pair.Value > 1 )
conflicts[pair.Key] = true;
nIterations = 0;
// Tant qu'il y a des conflits
while ( conflicts.Count > 0 )
{
Dictionary<int, bool> nextConflicts = new Dictionary<int, bool>();
// Pour chaque conflit
foreach ( int position in conflicts.Keys )
{
int value = positions[position];
// On résoud le conflit de cette position
nextConflicts.Remove( position );
// A cette position il reste 0 si la valeur est paire, 1 sinon
if ( value % 2 == 0 )
positions.Remove( position );
else
positions[position] = 1;
// On 'développe' des 1 sur la valeur / 2 à gauche et à droite de la position
for ( int i = 0 ; i < value / 2 ; i++ )
{
Update( positions, nextConflicts, position - i - 1 );
Update( positions, nextConflicts, position + i + 1 );
}
}
conflicts = nextConflicts;
nIterations++;
}
return positions;
}
void Update( Dictionary<int, int> positions, Dictionary<int, bool> nextConflicts, int position )
{
int value;
if ( positions.TryGetValue( position, out value ) )
{
value++;
positions[position] = value;
if ( value > 1 )
nextConflicts[position] = true;
}
else
{
positions.Add( position, 1 );
}
} |
Partager