用窮舉法!
以下是我剛剛寫的,請只用來參考借鑒,勿作它用。
//VC2008-C環境?編譯通過!
#include?<stdio.h>
#include?<string.h>
#include<conio.h>
#define?Dep?8?//最大窮舉步數,步數越多計算越慢
#define?Aim?5?//目標量,5L
int?Max[3]={10,7,3};//初始化各壺容積
int?Con[3]={10,0,0};//初始化各壺中水量
///////////輔助函數,實現倒水運算
int*?Dump(int?Before[3],int?Fm,int?To)
{
int?Res[3]; memcpy(Res,Before,sizeof(Res)); if(Before[Fm]+Before[To]>=Max[To]) Res[Fm]=Before[Fm]+Before[To]-Max[To],Res[To]=Max[To]; else Res[Fm]=0,Res[To]=Before[Fm]+Before[To]; return?Res;}
///////////遞歸函數,實現方法窮舉運算
char*?Recursive(int?Before[3],int?StopFlag,char?step[256])
{
int?Temp[3]; char?str[256],temp[256]; if(StopFlag>Dep) return?""; printf("."); if(Before[0]!=0) { if(Before[1]<Max[1]) {memcpy(Temp,Dump(Before,0,1),sizeof(Temp));
if(Temp[0]==Aim||Temp[1]==Aim||Temp[2]==Aim)
{
sprintf(str,"\r\n倒法是:%s-AB\r\n?壹***:%d步\r\n結果是:[%d,%d,%d]\r\n",step,StopFlag,Temp[0],Temp[1],Temp[2]);
printf("%s",str);
return?str;
}
else?if(StopFlag<Dep)
{
sprintf(temp,"%s-AB",step);
sprintf(str,"%s",Recursive(Temp,StopFlag+1,temp));
if(str[0]!=0)return?str;
}
} if(Before[2]<Max[2]) {memcpy(Temp,Dump(Before,0,2),sizeof(Temp));
if(Temp[0]==Aim||Temp[1]==Aim||Temp[2]==Aim)
{
sprintf(str,"\r\n倒法是:%s-AC\r\n?壹***:%d步\r\n結果是:[%d,%d,%d]\r\n",step,StopFlag,Temp[0],Temp[1],Temp[2]);
printf("%s",str);
return?str;
}
else?if(StopFlag<Dep)
{
sprintf(temp,"%s-AC",step);
sprintf(str,"%s",Recursive(Temp,StopFlag+1,temp));
if(str[0]!=0)return?str;
}
} } if(Before[1]!=0) { if(Before[0]<Max[0]) {memcpy(Temp,Dump(Before,1,0),sizeof(Temp));
if(Temp[0]==Aim||Temp[1]==Aim||Temp[2]==Aim)
{
sprintf(str,"\r\n倒法是:%s-BA\r\n?壹***:%d步\r\n結果是:[%d,%d,%d]\r\n",step,StopFlag,Temp[0],Temp[1],Temp[2]);
printf("%s",str);
return?str;
}
else?if(StopFlag<Dep)
{
sprintf(temp,"%s-BA",step);
sprintf(str,"%s",Recursive(Temp,StopFlag+1,temp));
if(str[0]!=0)return?str;
}
} if(Before[2]<Max[2]) {memcpy(Temp,Dump(Before,1,2),sizeof(Temp));
if(Temp[0]==Aim||Temp[1]==Aim||Temp[2]==Aim)
{
sprintf(str,"\r\n倒法是:%s-BC\r\n?壹***:%d步\r\n結果是:[%d,%d,%d]\r\n",step,StopFlag,Temp[0],Temp[1],Temp[2]);
printf("%s",str);
return?str;
}
else?if(StopFlag<Dep)
{
sprintf(temp,"%s-BC",step);
sprintf(str,"%s",Recursive(Temp,StopFlag+1,temp));
if(str[0]!=0)return?str;
}
} } if(Before[2]!=0) { if(Before[0]<Max[0]) {memcpy(Temp,Dump(Before,2,0),sizeof(Temp));
if(Temp[0]==Aim||Temp[1]==Aim||Temp[2]==Aim)
{
sprintf(str,"\r\n倒法是:%s-CA\r\n?壹***:%d步\r\n結果是:[%d,%d,%d]\r\n",step,StopFlag,Temp[0],Temp[1],Temp[2]);
printf("%s",str);
return?str;
}
else?if(StopFlag<Dep)
{
sprintf(temp,"%s-CA",step);
sprintf(str,"%s",Recursive(Temp,StopFlag+1,temp));
if(str[0]!=0)return?str;
}
} if(Before[1]<Max[1]) {memcpy(Temp,Dump(Before,2,1),sizeof(Temp));
if(Temp[0]==Aim||Temp[1]==Aim||Temp[2]==Aim)
{
sprintf(str,"\r\n倒法是:%s-CB\r\n?壹***:%d步\r\n結果是:[%d,%d,%d]\r\n",step,StopFlag,Temp[0],Temp[1],Temp[2]);
printf("%s",str);
return?str;
}
else?if(StopFlag<Dep)
{
sprintf(temp,"%s-CB",step);
sprintf(str,"%s",Recursive(Temp,StopFlag+1,temp));
if(str[0]!=0)return?str;
}
} } return?"";}
//在主函數中調用遞歸函數即可
int?main()
{
Recursive(Con,1,""); getchar();}