如此水的一道题目话了我一下午。。。。。真心但疼,不过即使过了我还是不明白我在加入队列的时候会标记现在的状态但是为毛从队列中拿出来的时候他的状态就没被标记呢?
就这个地方RE了一下午。。。
#include<stdio.h>
#include<string.h>
struct queue{
int num,water1,water2,d,step;
};
struct queue q[1000000];
void print(queue p){
if(p.num!=-1) print(q[p.num]);
if(p.num!=-1){
if(p.d==0){
printf("FILL(1)\n");
}
if(p.d==1){
printf("FILL(2)\n");
}
if(p.d==2){
printf("DROP(1)\n");
}
if(p.d==3){
printf("DROP(2)\n");
}
if(p.d==4){
printf("POUR(1,2)\n");
}
if(p.d==5){
printf("POUR(2,1)\n");
}
}
return ;
}
int main(){
int yes,front,push;
int a,b,target;
int judge[105][105];
while(scanf("%d%d%d",&a,&b,&target)!=EOF){
memset(judge,0,sizeof(judge));
yes=0;
/* if(target>a&&target>b){
printf("impossible\n");
continue;
}*/
q[0].num=-1;
q[0].water1=0;
q[0].water2=0;
q[0].d=0;
q[0].step=0;
judge[0][0]=1;
front=-1;
push=1;
while(front!=push){
//printf("yes\n");
queue p=q[++front];
judge[p.water1][p.water2]=1;//真心不加这句话就直接RE了 。。我实在是入队的时候标记了啊啊啊啊啊 真但疼
for(int i=0;i<6;i++){
queue s;
if(i==0){
if(p.water1<a&&judge[a][p.water2]==0){
s.water1=a;
s.water2=p.water2;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;//好吧 我卖盟了 两个等号
}
}
if(i==1){
if(p.water2<b&&judge[p.water1][b]==0){
s.water1=p.water1;
s.water2=b;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
}
if(i==2){
if(p.water1>0&&judge[0][p.water2]==0){
s.water1=0;
s.water2=p.water2;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
}
if(i==3){
if(p.water2>0&&judge[p.water1][0]==0){
s.water1=p.water1;
s.water2=0;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
}
if(i==4){
if(p.water1>0&&p.water2<b){
if((b-p.water2)>p.water1&&judge[0][p.water1+p.water2]==0){
s.water1=0;
s.water2=p.water1+p.water2;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
if((b-p.water2)<=p.water1&&judge[p.water1+p.water2-b][b]==0){
s.water1=p.water1-(b-p.water2);
s.water2=b;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
}
}
if(i==5){
if(p.water1<a&&p.water2>0){
if((a-p.water1)>p.water2&&judge[p.water1+p.water2][0]==0){
s.water1=p.water1+p.water2;
s.water2=0;
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
if((a-p.water1)<=p.water2&&judge[a][p.water2+p.water1-a]==0){
s.water1=a;
s.water2=p.water2-(a-p.water1);
s.num=front;
s.d=i;
s.step=p.step+1;
q[push]=s;
push++;
judge[s.water1][s.water2]==1;
}
}
}
if(s.water1==target||s.water2==target){
//printf("yesweq\n");
printf("%d\n",s.step);
yes=1;
print(s);
break;
}
}
if(yes==1) break;
}
if(yes==0){
printf("impossible\n");
}
}
return 0;
}