题意:输入a,b,c,分别代表1容器的容量,2容器的容量,经过变化后的某一容器剩下的水的容量,有三种变化。1.把某个瓶子装满,2.把某个瓶子里面的水都倒掉,3.把某个瓶子a里的水倒往另外一个瓶子b,(直到另外一个瓶子b被倒满或者是某个瓶子a被倒空)。输出最少变化次数,并且输出过程。如果不能到达输出impossible.
思路:因为是最短路,而且是搜索专题中的,因为是最短路,而且是有多个方向,所以选择用BFS;然后用一个二维数组str来存过程的字符串,并且用pre保存父节点以便于递归输出过程的时候使用找到最初的节点,然后因为要输出最短变化次数,所以直接使用lu来存次数变化,然后再使用一个数组a来保存该方向下选择的哪一个str,最关键的是使用二维数组来储存两瓶水的分别的情况,开始用的一维数组,但是发现两种情况得“同时出现,同时判断”,以题目样例为例子,如果使用两个数组来vis1,vis2储存得话,第一次循环就标记了1倒满得情况(vis1[a],vis2[0])和2倒满(vis1[0],vis2[b])得情况,那第二次循环的时候就不能再从1倒满的情况下进入2倒满得方向(因为vis1[a],vis2[b]已经标记),所以不能。而用二维数组来存得话就不会这样,一开始标记的vis[a][0],vis[0][b],第二次进入循环得时候就不会出现问题。
点击这里:传送门
Code:
#include<iostream>
#include<