當前位置:編程學習大全網 - 編程語言 - 急求!!c語言編程水壺分水問題

急求!!c語言編程水壺分水問題

用窮舉法!

以下是我剛剛寫的,請只用來參考借鑒,勿作它用。

//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();

}

  • 上一篇:數控技術應用專業就業前景怎麽樣
  • 下一篇:坡漢編程
  • copyright 2024編程學習大全網