Bonjour Poumbi, Doudou,
La solution à Doudou marche très bien mais impose de se limiter aux 360 1ères places. Il restera donc un gros quart de l'amphi complètement vide, ce qui est peut être souhaité ? Je propose une 2ème solution qui choisit les places aléatoirement sur toutes les places disponibles. Le nombre de places et d'étudiants peuvent varier, il suffit de changer les 2 paramètres dans la macro du bouton
Private Sub CommandButton1_Click()
If Not Amphi(500, 180) Then MsgBox "Impossible"
End Sub
La macro vérifie également la faisabilité au départ et en cours de route (exemple 10 étudiants à placer dans 20 places, il faut être chanceux pour réussir du premier coup) ou elle recommence si nécessaire. Elle pourra donc être assez longue dans les cas tangents. Pour le cas demandé il n'y a pas de difficulté.
Option Explicit
Function Amphi(n%, p%) As Boolean
Dim i%, tb%(), b As Boolean, nb%
Randomize
If p > n / 2 Then Exit Function 'placement impossible
'si l'Amphi n'est pas assez grand pour être sur que la solution soit trouvée du 1er coup
'il faudra procéder à des tests
If 3 * n > p Then b = True
Line1:
nb = n 'nb places restantes
ReDim tb(1 To n) 'tableau des n places 0 = vide, 1 occupée
For i = 1 To p 'pour chaque étudiant
Do 'début de boucle
Cells(i, 2) = Int(n * Rnd) + 1 'tirage au sort de la place
If b = True Then 'si configuration tests nécessaires
If p - i + 1 > nb Then 'si le nb étudiants restant à placer > nb places restantes
Columns(2).ClearContents 'effacer tout
GoTo Line1 'recommencer
End If
End If
If tb(Cells(i, 2)) = 0 Then 'si place tirée libre
tb(Cells(i, 2)) = 1 'place tirée occupée
If b = True Then nb = nb - 1 'si configuration tests nécessaire, mettre à jour le nb places restantes
Exit Do 'quitter boucle
End If
Loop 'revenir début boucle
If Cells(i, 2) > 1 Then 'si place attribuée pas la 1ere
If b = True And tb(Cells(i, 2) - 1) = 0 Then nb = nb - 1 'si configuration tests nécessaire et si place précédente libre
tb(Cells(i, 2) - 1) = 1 'place précédente considérée occupée
End If
If Cells(i, 2) < n Then 'si place attribuée pas la dernière
If b = True And tb(Cells(i, 2) + 1) = 0 Then nb = nb - 1 'si configuration tests nécessaire et si place suivante libre
tb(Cells(i, 2) + 1) = 1 'place suivante considérée occupée
End If
Next i 'étudiant suivant
Amphi = True 'placement réussi
End Function
Cordialement
Jules