$HanoiRodsClassDefinition = @"
using System.Collections.Generic;
using System.Linq;
public class HanoiRods
{
public List<int> RotA;
public List<int> RotB;
public List<int> RotC;
public HanoiRods (int spots=1)
{
RotA = Enumerable.Range(0,spots).ToList();
RotB= new List<int>();
RotC= new List<int>();
}
public int GetSpots()
{
return RotA.Count;
}
public HanoiRods New( List<int> rotA, List<int> rotB, List<int> rotC)
{
return new HanoiRods{
RotA = rotA,
RotB = rotB,
RotC = rotC,
};
}
}
"@Aby dodać definicję klasy do PS to wystarczy:
Add-Type -Language CSharp -TypeDefinition $HanoiRodsClassDefinition
A sam algorytm rozwiązywania wieży Hanoi w PS jest następujący:
function Solve-Hanoi
{
param(
[Parameter(Mandatory=$true)]
[HanoiRods]$rots,
[Parameter(Mandatory=$false)]
[int]$spots=$($rots.GetSpots()),
[ref]$moves
)
if($spots -gt 0)
{
Solve-Hanoi -spots ($spots-1) -rots ($rots.New($rots.RotA, $rots.RotC, $rots.RotB)) -moves $moves
$rots.RotC.Insert(0,$rots.RotA[0])
$rots.RotA.RemoveAt(0)
$moves.Value +=1
Write-Host ""
Write-Host "Spot $spots"
Write-Host "A $($rots.RotA)"
Write-Host "B $($rots.RotB)"
Write-Host "C $($rots.RotC)"
Solve-Hanoi -spots ($spots-1) -rots ($rots.New($rots.RotB, $rots.RotA, $rots.RotC)) -moves $moves
}
}
Z ciekawych parametrów jest zmienna [ref]$moves, którą przekazujemy przez referencje. Możemy teraz definiować parametry do rozwiązania wieży Hanoi:
$hanoi = new-object HanoiRods 5 [ref]$moves=0
A same wywołanie jest następujące:
Solve-Hanoi -rots $hanoi -moves $moves $moves
Dla 5 krążków musimy wykonać 31 ruchów, aby rozwiązać problem wieży Hanoi.
Brak komentarzy:
Prześlij komentarz