(Segmentation Fault 这个代码提交时返回信息是这个,内存区段错误,至今没有搞懂这是个什么错误。这个代码虽然没有过,但是方法是不会有错的,这里只是介绍bfs能用来解决这一类问题,至少还是过了样例的)
注意这个是模拟手动入队,传进去的是tail,而不是head,因为要跳过两个入口,所以这道题是双入口的搜索,并且ready很重要,每次入一次队就要把它新的数据存到队里,而且tail要向下走一步,这道题就是要讨论六中情况:
fill A、fill B、pour A B、pour B A、empty A、empty B,逐步讨论完就可以了
#include<iostream>
#include<cstring>
using namespace std;
struct condition
{
int a,b;
int father,mean;
};
condition q[10000];
int A,B,N;
void ready()
{
for(int i=0;i<10000;i++)
{
q[i].a=q[i].b=q[i].father=q[i].mean=0;
}
}
void print(int x)
{
if(x==-1)
return;
else
print(q[x].father);
switch(q[x].mean)
{
case 1:cout<<"fill A"<<endl;break;
case 2:cout<<"fill B"<<endl;break;
case 3:cout<<"pour A "<<endl;break;
case 4:cout<<"pour B "<<endl;break;
case 5:cout<<"empty A"<<endl;break;
case 6:cout<<"empty B"<<endl;break;
}
}
void bfs()
{
if(B==N)
{
cout<<"fill B"<<endl;
cout<<"success"<<endl;
}
ready();
int head=0,tail=0;
q[tail].a=A;
q[tail].father=-1;
q[tail].mean=1;
tail++;
q[tail].b=B;
q[tail].father=-1;
q[tail].mean=2;
tail++;
while(head<tail)
{
condition con=q[head];
head++;
if(con.a<A)
{
condition buf=con;
buf.a=A;
buf.father=head-1;
buf.mean=1;
q[tail]=buf;
tail++;
}
if(con.b<B)
{
condition buf=con;
buf.b=B;
buf.father=head-1;
buf.mean=2;
q[tail]=buf;
tail++;
}
if(con.a>0&&con.b<B)
{
condition buf=con;
int temp=min(buf.a,B-buf.b);
buf.a-=temp;
buf.b+=temp;
buf.father=head-1;
buf.mean=3;
q[tail]=buf;
if(buf.b==N)
{
print(tail);
break;
}
tail++;
}
if(con.b>0&&con.a<A)
{
condition buf=con;
int temp=min(buf.b,A-buf.a);
buf.a+=temp;
buf.b-=temp;
buf.father=head-1;
buf.mean=4;
q[tail]=buf;
if(buf.b==N)
{
print(tail);
break;
}
tail++;
}
if(con.a>0)
{
condition buf=con;
buf.a=0;
buf.father=head-1;
buf.mean=5;
q[tail]=buf;
tail++;
}
if(con.b>0)
{
condition buf=con;
buf.b=0;
buf.father=head-1;
buf.mean=6;
q[tail]=buf;
tail++;
}
}
}
int main()
{
while(cin>>A>>B>>N)
{
bfs();
cout<<"success"<<endl;
}
return 0;
}