有两个无刻度标志的水杯,分别可以装5升和2升水,设另有一8升水杯,可用来向其他水杯灌水或倒出水,两水杯间的水也可以互相灌,已知5升水杯的水是满的,2升水杯是空的,问如何通过倒水或灌水操作,用最少的步数能在2升水杯中量出1升水来。编一程序解决。
最好用广度优先搜索算法,各位大虾给点思路,能给点代码更好了

解决方案 »

  1.   

    所谓状态,就是每个杯子里有多少水
    所谓队列,就是先进先出的线性存储结构
    所谓入队,就是将每个每个杯子有多少水的信息作为一个结点添加到队列中
    所谓状态推倒的所有可能状态,就是所有倒水方案所对应得到的每个杯子多少水的状态(你怎样推到所有可能,你自己还要写算法,这不是难点)我把结构定义也给你写了吧type
      // 状态记录类型
      TCupStatus = record
        Cup3: 0..3; // 3 升水杯乘水量
        Cup5: 0..5; // 5 升水杯乘水量
        Cup8: 0..8; // 8 升水杯乘水量
      end;  // 队列定义
      PQueueNode = ^TQueueNode;  TQueueNode = record
        CupStatus: TCupStatus;  // 状态
        Next: PQueueNode;
      end;如果上面的定义你看不明白,你就去学学数据结构,不要再问我了;如果明白,那你就做吧,哪里有技术难点再说。