设有3个没有刻度的杯子的容量分别是a,b,c,最初只有第3个杯子装满了c升水,其他两个杯子为空。最少需要倒多少升水才能让某一个杯子中的水有d升。如果无法做到恰好有d升,就让某一个杯子里的水是d’升,其中d’< d,并且尽量接近d。
解法
解法和八数码问题一样,关键在于建立图模型,进行状态转移,把状态想象成图中的结点。
问题形式有总倒水量最少和总步数最少。如果是总倒水量最少,可以用优先队列priority_queue来维护每个状态当前的总倒水量;如果是总步数最少,就可以用队列来维护状态,采用BFS进行搜索。
总倒水量最少
题目链接Uva10603-Fill
1 | /* |
总步数最少
1 | /* |