描述:算是哈希判重问题吧,不过数据不大,直接用数组标记就行
#include <cstdio>
#include <cstring>
bool v[1005][1005];
char s[6][10]= {"fill A","fill B","empty A","empty B","pour A B","pour B A"};
struct Jugs
{
int A,B;
int pos;
int oper;
};
Jugs p[1000005];
void show(int x)
{
if(x>0) show(p[x].pos);
if(x>0) printf("%s\n",s[p[x].oper]);
}
int main()
{
// freopen("a.txt","r",stdin);
int n,m,goal,flag;
while(scanf("%d%d%d",&n,&m,&goal)!=EOF)
{
if(!goal)
{
puts("success");
continue;
}
for(int i=0; i<=m; ++i)
for(int j=0; j<=m; ++j) v[i][j]=0;
v[0][0]=1;
p[0].A=p[0].B=flag=0;
p[0].oper=p[0].pos=-1;
int last=1,first=0;
while(first<last)
{
int A=p[first].A,B=p[first].B;
for(int i=0; i<6; i++)
{
int a=0,b=0;
if(i==2&&A) a=0,b=B;
if(i==0&&A<n) a=n,b=B;
if(i==3&&B) a=A,b=0;
if(i==1&&B<m) b=m,a=A;
if(i==4&&A&&B<m)
{
if(A+B<m) b=A+B;
else a=A+B-m,b=m;
}
if(i==5&&A<n&&B)
{
if(A+B<n) a=A+B;
else a=n,b=A+B-n;
}
if(!v[a][b])
{
v[a][b]=1;
p[last].pos=first;
p[last].oper=i;
p[last].A=a;
p[last].B=b;
if(b==goal)
{
flag=1;
break;
}
++last;
}
}
if(flag) break;
++first;
}
show(last);
puts("success");
}
return 0;
}
571 - Jugs
最新推荐文章于 2017-11-11 17:44:06 发布