82 lines
2.3 KiB
C#
82 lines
2.3 KiB
C#
namespace su.divan2000.PLandDS_hanoi
|
|
{
|
|
class HanoiTowers
|
|
{
|
|
private int[] tower_A;
|
|
private int[] tower_B;
|
|
private int[] tower_C;
|
|
|
|
private int size;
|
|
|
|
public HanoiTowers(int size)
|
|
{
|
|
this.size = size;
|
|
tower_A = new int[size];
|
|
tower_B = new int[size];
|
|
tower_C = new int[size];
|
|
|
|
for (int i = 0; i < size; i++)
|
|
{
|
|
tower_A[i] = size - i;
|
|
}
|
|
}
|
|
|
|
public string toString()
|
|
{
|
|
int charsPerTower = size.ToString().Length;
|
|
string result = "";
|
|
for (int i = size - 1; i >= 0; i--)
|
|
{
|
|
result += tower_A[i].ToString().PadLeft(charsPerTower).Replace("0", "|") + " ";
|
|
result += tower_B[i].ToString().PadLeft(charsPerTower).Replace("0", "|") + " ";
|
|
result += tower_C[i].ToString().PadLeft(charsPerTower).Replace("0", "|") + "\n";
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public void move(int from, int to)
|
|
{
|
|
int[] sourceTower = getTower(from);
|
|
int[] targetTower = getTower(to);
|
|
|
|
int sourceTopIndex = getTopIndex(sourceTower);
|
|
int targetTopIndex = getTopIndex(targetTower);
|
|
|
|
if (sourceTopIndex == -1)
|
|
{
|
|
throw new InvalidOperationException("No disk to move");
|
|
}
|
|
|
|
if (targetTopIndex != -1 && sourceTower[sourceTopIndex] > targetTower[targetTopIndex])
|
|
{
|
|
throw new InvalidOperationException("Cannot place larger disk on smaller one");
|
|
}
|
|
|
|
targetTower[targetTopIndex + 1] = sourceTower[sourceTopIndex];
|
|
sourceTower[sourceTopIndex] = 0;
|
|
}
|
|
|
|
private int[] getTower(int index)
|
|
{
|
|
switch (index)
|
|
{
|
|
case 0: return tower_A;
|
|
case 1: return tower_B;
|
|
case 2: return tower_C;
|
|
default: throw new ArgumentException("Invalid tower index");
|
|
}
|
|
}
|
|
|
|
private int getTopIndex(int[] tower)
|
|
{
|
|
for (int i = size - 1; i >= 0; i--)
|
|
{
|
|
if (tower[i] != 0)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
return -1; // Tower is full
|
|
}
|
|
}
|
|
} |