我的 C# 程序:

using System;
using System.Collections.Generic;

static class Pot2
{
  static int[] Max = { 5, 6 }; // 每只壶的最大容量,可为任意正整数
  static int[] Pot = { 0, 0 }; // 每只壶的当前水位
  static List<int[]> SL = new List<int[]>(); // 记录水位
  static List<int[]> SA = new List<int[]>(); // 记录动作

  static void Main()
  {
    Pot[0] = 3;  // <------ 这是要从池塘中取的水量,可为任意正整数
    if (Pot[0] < 0 || Pot[0] > Max[0] || Pot[1] < 0 || Pot[1] > Max[1])
    {
      Console.WriteLine("参数超过允许范围。");
      return;
    }
    // 如果水量不是两只壶的最大容量的最大公约数的整数倍,则无解
    if ((Pot[0] + Pot[1]) % Gcd(Max[0], Max[1]) != 0)
    {
      Console.WriteLine("无解。");
      return;
    }
    SL.Add(new int[]{ Pot[0], Pot[1] });
    Solve();
    SA.Add(new int[]{ 0, 0 });
    Print();
  }

  // 返回两个非负整数的最大公约数
  static int Gcd(int a, int b)
  {
    if (b == 0) return a;
    return Gcd(b, a % b);
  }

  // 解题:反过来思考,先假设已成功,如果最后能得到两只空壶就OK了
  static void Solve()
  {
    if      (Pot[0] == 0 && Pot[1] == 0) return;
    else if (Pot[0] == 0 && Pot[1] == Max[1]) Del(1);
    else if (Pot[1] == 0 && Pot[0] == Max[0]) Del(0);
    else if (Pot[0] == 0 || Pot[1] == 0)
    {
      int i = (Pot[0] == 0) ? 0 : 1;
      int j = (Pot[0] == 0) ? 1 : 0;
      Add(i);
      while (Pot[i] > 0)
      {
        Mov(i);
        if (Pot[j] == Max[j]) Del(j);
      }
      if (Pot[i] == 0 && Pot[j] == 0) return;
    }
    else return;
    Solve();
  }

  // 第i壶加满水
  static void Add(int i)
  {
    Pot[i] = Max[i];
    SL.Add(new int[]{ Pot[0], Pot[1] });
    SA.Add(new int[]{ 1, i });
  }

  // 清空第i壶
  static void Del(int i)
  {
    Pot[i] = 0;
    SL.Add(new int[]{ Pot[0], Pot[1] });
    SA.Add(new int[]{ 2, i });
  }

  // 第i壶的水尽量倒住另一壶
  static void Mov(int i)
  {
    int j = (i + 1) % 2;
    int x = Math.Min(Max[j] - Pot[j], Pot[i]);
    Pot[i] -= x;
    Pot[j] += x;
    SL.Add(new int[] { Pot[0], Pot[1] });
    SA.Add(new int[] { 3, j });
  }

  static string[] Action = {"初始状态       ", "清空第{0}壶      ", "加满第{0}壶      ", "第{0}壶倒往另一壶"};

  // 打印解题过程
  static void Print()
  {
    Console.WriteLine("两只壶的最大容量分别是 -- [{0}, {1}]", Max[0], Max[1]);
    // 实际操作是前面的解题过程的逆序,因为解题思路是反过来考虑的。
    for (int i = SL.Count - 1; i > 0; i--)
    {
      Console.Write("步骤{0,2} ", SL.Count - 1 - i);
      Console.Write(Action[SA[i][0]], SA[i][1] + 1);
      Console.WriteLine(" -> ({0}, {1})", SL[i][0], SL[i][1]);
    }
    Console.WriteLine("成功!");
  }
}

输出:

两只壶的最大容量分别是 -- [5, 6]
步骤 0 初始状态        -> (0, 0)
步骤 1 加满第1壶       -> (5, 0)
步骤 2 第1壶倒往另一壶 -> (0, 5)
步骤 3 加满第1壶       -> (5, 5)
步骤 4 第1壶倒往另一壶 -> (4, 6)
步骤 5 清空第2壶       -> (4, 0)
步骤 6 第1壶倒往另一壶 -> (0, 4)
步骤 7 加满第1壶       -> (5, 4)
步骤 8 第1壶倒往另一壶 -> (3, 6)
成功!

社区的代码字体似乎是两个半角字符比一个全角字符略宽,没能对齐。