【原创】一道算法题
原题:
一个桶中有12斤油,要求倒出6斤,可现在另外只有两个桶,分别可装8斤与5斤,请问应如何来倒?
下面给的是一般的算法,即桶中有a斤油,要求倒出d斤,可现在另外只有两个桶,分别可装b斤与c斤
代码
class Program
{
private static int x;
private static int y;
private static int z;
private static int x0;
private static int y0;
private static int z0;
private static int n;
private static bool result = false;
private static List<int> list=new List<int>();
static void Main(string[] args)
{
SuanFa(12,8,5,6);
Console.ReadLine();
}
private static void SuanFa(int a,int b,int c,int d)
{
while (n<1000 && !(x==d) && !(y==d) && !(z==d))
{
if(n==0)
{
x = a;
y = 0;
z = 0;
n = 0;
Save(x,y,z);
}
if (!Get(list, n))
{
for (int j = 0; j < n; j++)
{
Get(list, j);
Console.WriteLine(string.Format("{0},{1},{2}", x, y, z));
}
Console.WriteLine("{0}失败", n);
return;
}
if (x!=0)
{
x0 = x;
y0 = y;
z0 = z;
for (int i = 0; i < 4; i++)
{
if (F(a, b, c,d, x, y, z, i, 1))
Save(x,y,z);
if(result)
{
for(int j=0;j<n;j++)
{
Get(list, j);
Console.WriteLine(string.Format("{0},{1},{2}",x,y,z));
}
Console.WriteLine("{0}成功", n);
return;
}
x = x0;
y = y0;
z = z0;
}
}
if (y !=0)
{
x0 = x;
y0 = y;
z0 = z;
for (int i = 0; i < 4; i++)
{
if( F(b, a, c,d, y, x, z,i, 2))
Save(x, y, z);
if (result)
{
for (int j = 0; j < n; j++)
{
Get(list, j);
Console.WriteLine(string.Format("{0},{1},{2}", x, y, z));
}
Console.WriteLine("{0}成功", n);
return;
}
x = x0;
y = y0;
z = z0;
}
}
if (z!=0)
{
x0 = x;
y0 = y;
z0 = z;
for (int i = 0; i < 4; i++)
{
if( F(c, b, a,d, z, y,x ,i, 3))
Save(x, y, z);
if (result)
{
for (int j = 0; j < n+1; j++)
{
Get(list, j);
Console.WriteLine(string.Format("{0},{1},{2}", x, y, z));
}
Console.WriteLine("{0}成功", n);
return;
}
x = x0;
y = y0;
z = z0;
}
}
n += 1;
}
Console.WriteLine("{0}失败", n);
}
private static void Save(int a,int b,int c)
{
if (!list.Contains(100 * a + 10 * b + c))
list.Add(100*a+10*b+c);
}
private static bool Get(List<int> li,int m)
{
if(li.Count>=m+1)
{
x = li[m] / 100;
y = (li[m] - x * 100) / 10;
z = li[m] - x * 100 - y * 10;
return true;
}
return false;
}
private static bool F(int a,int b,int c,int dd,int m,int n,int p,int d,int t)
{
if(d==0)
{
m = m + n - b;
p = p;
n = b;
}
if(d==1)
{
m = m + p - c;
p = c;
n = n;
}
if(d==2)
{
n += m;
p = p;
m = 0;
}
if(d==3)
{
p += m;
n = n;
m = 0;
}
if (m == x && n == y && p == z && t == 1)
return false;
if (m == y && n == x && p == z && t == 2)
return false;
if (m == z && n == y && p == x && t == 3)
return false;
if (m < 0 || n < 0 || p < 0 || m>a || n>b || p>c)
return false;
if(t==1)
{
x = m;
y = n;
z = p;
}
if(t==2)
{
y = m;
x = n;
z = p;
}
if(t==3)
{
z = m;
y = n;
x = p;
}
if(x==dd)
{
result = true;
}
return true;
}
}