代码解题之“*升水,有个*升,和*升的空桶,让你取出*升水”
来源:互联网 发布:c语言初学者视频百度云 编辑:程序博客网 时间:2024/04/30 16:22
bool get = false;
void Start ()
{
ExchangeWater(12, 9, 5, 6);
// ExchangeWater(10, 7, 3, 5);
}
/// <summary>
/// 12升水,有个9升,和5升的空桶,让你取出6升水
/// </summary>
/// <param name="fullCansLitre"></param>
/// <param name="emptyCansLitre1"></param>
/// <param name="emptyCansLitrel2"></param>
/// <param name="evaluation"></param>
private void ExchangeWater(int fullCansLitre, int emptyCansLitre1, int emptyCansLitre2, int evaluation)
{
List<int[]> resoult = new List<int[]>();
Recursion(new int[3] { fullCansLitre, emptyCansLitre1, emptyCansLitre2 }, evaluation, new int[3] { fullCansLitre, 0, 0 }, ref resoult);
}
/// <summary>
/// 三个瓶中某一个向另外两个倾倒水
/// </summary>
/// <param name="one"></param>
/// <param name="two"></param>
/// <param name="evaluation"></param>
/// <param name="resoult"></param>
private void PourAwayTheWater(int[] one, int[] two, int evaluation, ref List<int[]> resoult)
{
int m,n;
for (int i = 0; i < one.Length; i++)
{
m = (i + 1) % 3;
for (int j = 0; j < 2; j++)
{
n = (m + j) % 3;
if (one[i] > 0 && two[n] != one[n])
{
int deltaWater = 0;
int[] tempBottle = new int[3] { two[0], two[1], two[2] };
if (one[n] - two[n] >= two[i])
{
deltaWater = two[i];
}
else
{
deltaWater = one[n] - two[n];
}
tempBottle[i] -= deltaWater;
tempBottle[n] += deltaWater;
Recursion(one, evaluation, tempBottle, ref resoult);
}
}
}
}
/// <summary>
/// 递归向后遍历
/// </summary>
/// <param name="fullCansLitre"></param>
/// <param name="emptyCansLitre1"></param>
/// <param name="emptyCansLitre2"></param>
/// <param name="evaluation"></param>
/// <param name="bottle"></param>
/// <param name="resoult"></param>
private void Recursion(int[] cansLitre, int evaluation, int[] bottle, ref List<int[]> resoult)
{
if (get) return;
if (AdjustCotains(resoult, bottle))
{
// Debug.Log("此结果已出现." + bottle[0] + "," + bottle[1] + "," + bottle[2]);
return;
}
Debug.Log("添加" + bottle[0] + "," + bottle[1] + "," + bottle[2]);
if(bottle[0]== evaluation ||bottle[1]== evaluation ||bottle[2]== evaluation )
{
get = true;
Debug.Log("您要的结果已出现" + bottle[0] + "," + bottle[1] + "," + bottle[2]);
}
resoult.Add(bottle);
PourAwayTheWater(cansLitre, bottle, evaluation, ref resoult);
}
/// <summary>
/// 判断是否已经包含此结果
/// </summary>
/// <param name="resoult"></param>
/// <param name="temp"></param>
/// <returns></returns>
private bool AdjustCotains(List<int[]> resoult,int[] temp)
{
if (resoult.Count == 0)
return false;
int same;
foreach (int[] item in resoult)
{
same = 0;
for (int i = 0; i < item.Length; i++)
{
if (temp[i] == item[i])
{
same++;
}
}
if (same == 3)
return true;
}
return false;
}
void Start ()
{
ExchangeWater(12, 9, 5, 6);
// ExchangeWater(10, 7, 3, 5);
}
/// <summary>
/// 12升水,有个9升,和5升的空桶,让你取出6升水
/// </summary>
/// <param name="fullCansLitre"></param>
/// <param name="emptyCansLitre1"></param>
/// <param name="emptyCansLitrel2"></param>
/// <param name="evaluation"></param>
private void ExchangeWater(int fullCansLitre, int emptyCansLitre1, int emptyCansLitre2, int evaluation)
{
List<int[]> resoult = new List<int[]>();
Recursion(new int[3] { fullCansLitre, emptyCansLitre1, emptyCansLitre2 }, evaluation, new int[3] { fullCansLitre, 0, 0 }, ref resoult);
}
/// <summary>
/// 三个瓶中某一个向另外两个倾倒水
/// </summary>
/// <param name="one"></param>
/// <param name="two"></param>
/// <param name="evaluation"></param>
/// <param name="resoult"></param>
private void PourAwayTheWater(int[] one, int[] two, int evaluation, ref List<int[]> resoult)
{
int m,n;
for (int i = 0; i < one.Length; i++)
{
m = (i + 1) % 3;
for (int j = 0; j < 2; j++)
{
n = (m + j) % 3;
if (one[i] > 0 && two[n] != one[n])
{
int deltaWater = 0;
int[] tempBottle = new int[3] { two[0], two[1], two[2] };
if (one[n] - two[n] >= two[i])
{
deltaWater = two[i];
}
else
{
deltaWater = one[n] - two[n];
}
tempBottle[i] -= deltaWater;
tempBottle[n] += deltaWater;
Recursion(one, evaluation, tempBottle, ref resoult);
}
}
}
}
/// <summary>
/// 递归向后遍历
/// </summary>
/// <param name="fullCansLitre"></param>
/// <param name="emptyCansLitre1"></param>
/// <param name="emptyCansLitre2"></param>
/// <param name="evaluation"></param>
/// <param name="bottle"></param>
/// <param name="resoult"></param>
private void Recursion(int[] cansLitre, int evaluation, int[] bottle, ref List<int[]> resoult)
{
if (get) return;
if (AdjustCotains(resoult, bottle))
{
// Debug.Log("此结果已出现." + bottle[0] + "," + bottle[1] + "," + bottle[2]);
return;
}
Debug.Log("添加" + bottle[0] + "," + bottle[1] + "," + bottle[2]);
if(bottle[0]== evaluation ||bottle[1]== evaluation ||bottle[2]== evaluation )
{
get = true;
Debug.Log("您要的结果已出现" + bottle[0] + "," + bottle[1] + "," + bottle[2]);
}
resoult.Add(bottle);
PourAwayTheWater(cansLitre, bottle, evaluation, ref resoult);
}
/// <summary>
/// 判断是否已经包含此结果
/// </summary>
/// <param name="resoult"></param>
/// <param name="temp"></param>
/// <returns></returns>
private bool AdjustCotains(List<int[]> resoult,int[] temp)
{
if (resoult.Count == 0)
return false;
int same;
foreach (int[] item in resoult)
{
same = 0;
for (int i = 0; i < item.Length; i++)
{
if (temp[i] == item[i])
{
same++;
}
}
if (same == 3)
return true;
}
return false;
}
0 0
- 代码解题之“*升水,有个*升,和*升的空桶,让你取出*升水”
- 5.准确量出2升水,如果你有4升和5升的碗
- 4.你怎样只用4升和9升的碗量出六升水?
- 解:通过一个9升水的桶和一个4升水的桶在河里取6升水
- 面试题—有两个无刻度的水桶,分别能装7升水(记为A)和5升水(记为B),那么通过这两个桶可能获得多少升水
- 6.M设想有三个碗。A碗(8升容量)里有5升水。B碗(5升容量)里有3升水。C碗(3升容量)里有2升水。 你能只倒两次而准确地量出1升水吗?
- 如何用3升和5升桶量取4升水?
- 如何用3升和5升桶量取4升水?
- 把m升水倒入n个桶中,可以有桶为空,问有多少种倒法
- 3.你有三个碗:分别是7,4,3升容量。只有7升那个是满的。用最少次数倒出分别是2,2,和3升水。
- 编程实现,有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升
- 有10升水装在杯子里,还有一个3升的杯子和一个7升杯子,请问如何实现5、5平分?
- 关于使用一个5升容器和一个6升容器量出3升水的一点解决办法
- 题解分析及总结:经典逻辑面试题“假设有一个池塘,里面有无穷多的水,现有2个空水壶,如何使用少于15L的水,用2个水壶从池塘里取得3升水”
- 量筒量水问题1--一个盛满水的池子,有一个6升的量筒,一个5升的量筒,怎样量出3升水?
- 算法-3个水桶8升水
- 有两个瓶子一个瓶承5升水一个瓶子成3升水,那怎么可以成四升水呢
- 用容积为15升和27升的两个杯子向一个水桶中注水,可以精确向一个水桶中注入多少升水呢
- Android抽象布局——include、merge 、ViewStub
- hibernate和ibatis的区别
- 通俗解释「为什么数据库难以拓展」
- 并行计算MPI(三):计算π
- PAT 1003. Emergency (25)
- 代码解题之“*升水,有个*升,和*升的空桶,让你取出*升水”
- [leetcode]25 Number of 1 Bits
- VS+VA搭建顺手的NDK集成开发环境
- 使用代码关闭APP“exit(0);”
- ASP.NET中的认证与授权
- IOS游戏上架 玩家iap充值 base64码发到苹果验证收据 返回值里面没有 in_app 段的奇怪问题.
- OpenCV之基于GMM的运动目标检测
- iOS 苹果官方文档
- CUDA 两个向量相加: 当数组的元素个数大于所开的线程数量的时候的解决办法