还是搜索的问题,只是每次的选择有四种,要根据情况判断!
#include <stdio.h>
#define PATOB 1
#define PBTOA 2
#define FA 3
#define FB 4
#define EA 5
#define EB 6
typedef struct
{
int act;
int former;
int a;
int b;
}node;
int a,b,n;
int ret(node *str,int pos);
int main(int argc, char *argv[])
{
int i;
while((scanf("%d %d %d",&a,&b,&n))!=EOF)
{
int now = 0;
int tail = 2;
node str[100000]={0};
int stack[1000]={0};
str[0].act = FA;
str[1].act = FB;
str[0].former = str[1].former = -1;
str[0].a = a;
str[0].b = 0;
str[1].a = 0;
str[1].b = b;
while(str[now].b!=n)
{
if(str[now].a!=0&&str[now].b!=b)
{
str[tail].act = PATOB;
str[tail].former = now;
if(str[now].a + str[now].b <= b)
{
str[tail].a = 0;
str[tail].b = str[now].a + str[now].b;
}
else
{
str[tail].a = str[now].a + str[now].b - b;
str[tail].b = b;
}
if(ret(str,tail)!=0)
{
tail++;
}
}
if(str[now].b!=0&&str[now].a!=a)
{
str[tail].act = PBTOA;
str[tail].former = now;
if(str[now].b + str[now].a <= a)
{
str[tail].b = 0;
str[tail].a = str[now].b + str[now].a;
}
else
{
str[tail].b = str[now].b + str[now].a - a;
str[tail].a = a;
}
if(ret(str,tail)!=0)
{
tail++;
}
}
if(str[now].a < a)
{
str[tail].a = a;
str[tail].b = str[now].b;
str[tail].former = now;
str[tail].act = FA;
if(ret(str,tail)!=0)
{
tail++;
}
}
if(str[now].b < b)
{
str[tail].b = b;
str[tail].a = str[now].a;
str[tail].former = now;
str[tail].act = FB;
if(ret(str,tail)!=0)
{
tail++;
}
}
if(str[now].a!=0)
{
str[tail].a = 0;
str[tail].b = str[now].b;
str[tail].former = now;
str[tail].act = EA;
if(ret(str,tail)!=0)
{
tail++;
}
}
if(str[now].b!=0)
{
str[tail].b = 0;
str[tail].a = str[now].a;
str[tail].former = now;
str[tail].act = EB;
if(ret(str,tail)!=0)
{
tail++;
}
}
now++;
}
for(i = 0;now >= 0;i++)
{
stack[i] = now;
now = str[now].former;
}
i--;
while(i>=0)
{
int t = str[stack[i]].act;
switch(t)
{
case PATOB:printf("pour A B\n");break;
case PBTOA:printf("pour B A\n");break;
case FA:printf("fill A\n");break;
case FB:printf("fill B\n");break;
case EA:printf("empty A\n");break;
case EB:printf("empty B\n");break;
default:break;
}
i--;
}
printf("success\n");
}
return 0;
}
int ret(node *str,int pos) //很重要!!!不然会超时
{
int i;
int flag = 1;
for(i = 0;i < pos;i++)
{
if(str[i].a==str[pos].a&&str[i].b==str[pos].b)
{
flag = 0;
break;
}
}
return flag;
}
还有一点要注意的是,如果你不加判断的搜索的话还是会超时的,要判断进行操作后出现的状态是否在之前出现过,如果出现过,这种情况就不要考虑了,不然会造成重复!!!