#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct t{
int z[3];
int num;
int n[100];
}b[10050];
int stime=1; //数字越大.休眠时间越久
int m=0,i,j=0,k;
int time1=107,time2=103,time3=710,time4=73,time5=37,time6=310;
int head=1,tail=2,btime=0,bord;
void zzzz(){
b[tail].n[b[i].n[0]]=tail;
for(k=0;k<b[i].n[0];k++) b[tail].n[k]=b[i].n[k];
b[tail].n[0]++;
printf("\n\t%d\t%d\t%d\n",b[i].z[0],b[i].z[1],b[i].z[2]);
printf("%d\t%d\t%d\t%d\n",btime, b[tail].z[0],b[tail].z[1],b[tail].z[2]);
_sleep(stime*1000); //休眠时间单位ms
tail++;
}
int a[6][3]={
0,1,2,
0,2,1,
1,0,2,
1,2,0,
2,0,1,
2,1,0
};
int main()
{
b[0].z[0]=10; b[0].z[1]=7; b[0].z[2]=3;
b[1].z[0]=10; b[1].z[1]=0; b[1].z[2]=0; b[1].n[0]=2; b[1].n[1]=1;
//三杯子,初始只有10L的杯子是满的
// b[0][1]=1; b[1][1]=0; b[2][1]=0;
//三杯子,初始10L的杯子是满的
for(i=0;i<6;i++) {
for(j=0;j<3;j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
m=0;
while(head<tail){
if(m==1) break;
btime++;
bord=tail;
for(i=head;i<bord;i++){
if(m==1) break;
printf("\n%d\t%d\t%d\t%d\n",btime,b[i].z[0],b[i].z[1],b[i].z[2]);
for(j=0;j<6;j++){
if(b[i].z[0]==5||b[i].z[1]==5||b[i].z[2]==5){ m=1;break; }
//找到55平分则退出
if(b[i].z[a[j][0]]!=0){ //如果第a[j][0]的杯子有水
if(b[i].z[a[j][1]]<b[0].z[a[j][1]]){
if(b[i].z[a[j][0]]+b[i].z[a[j][1]]<b[0].z[a[j][1]]){
b[tail].z[a[j][0]]=0;
b[tail].z[a[j][1]]=b[i].z[a[j][0]]+b[i].z[a[j][1]];
b[tail].z[a[j][2]]=b[i].z[a[j][2]];
}
else{
b[tail].z[a[j][0]]=b[i].z[a[j][0]]+b[i].z[a[j][1]]-b[0].z[a[j][1]];
b[tail].z[a[j][1]]=b[0].z[a[j][1]];
b[tail].z[a[j][2]]=b[i].z[a[j][2]];
}
zzzz();
if(b[tail-1].z[a[j][0]]==5||b[tail-1].z[a[j][1]]==5||b[tail-1].z[a[j][2]]==5){ m=1; break; }
}
}
}
}
head=bord;
}
if(m==1){
printf("找到了!\n");
for(k=1;k<b[tail-1].n[0];k++){
for(j=0;j<3;j++) printf("%d\t",b[b[tail-1].n[k]].z[j]);
printf("\n");
}
}
}
windows下Dev解10l7l3l倒水,for循环版本