【原创】一道算法题

原题:

一个桶中有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;
}
}

 

posted on 2010-09-14 15:10  shaya  阅读(234)  评论(0编辑  收藏  举报

导航