當前位置:編程學習大全網 - 源碼下載 - 壹只桶裏有12升油,要求平均分為兩份,現有9升和5升兩個空桶,用C語言遞歸解決,最好寫出源代碼,謝謝

壹只桶裏有12升油,要求平均分為兩份,現有9升和5升兩個空桶,用C語言遞歸解決,最好寫出源代碼,謝謝

#include<stdio.h>

unsigned?short?temp[20];//存儲中間狀態

int?step?=?0;//

char?OP[][16]={

"初始狀態",

"A全倒給B",

"A全倒給C",

"A倒滿B",

"A倒滿C",

"B全倒給A",

"B全倒給C",

"B倒滿C",

"C全倒給A",

"C全倒給B",

"C倒滿B"

};

//輸出步驟

void?display()

{

int?i;

for(i=0;i<=step;i++)

printf("%2d:[?%10s?]?:?%d,%d,%d\n",

? i+1,

? OP[(temp[i]&0xf000)>>12],

? (temp[i]&0xf00)>>8,

? (temp[i]&0xf0)>>4,

? temp[i]&0xf);

}

//檢查是否會出現重復狀態

int?check()

{

int?i;

for(i=0;i<step;i++)

{

if((temp[step]&0x0fff)==(temp[i]&0x0fff))?return?1;

}

return?0;

}

//遞歸函數

//A,B,C分別是3個油桶當前有多少油,op是倒油的具體操作

int?foo(int?A12,int?B9,?int?C5,?int?op)

{

temp[step]=(op<<12)|(A12<<8)|(B9<<4)|C5;

if(check()==1)?return?0;

if(A12==6?&&?B9==6)?return?1;

step++;

//A12全部倒給B9

if(A12?&&?(A12+B9<=9)?&&?foo(0,A12+B9,C5,1))?return?1;

//A12全部倒給C5

else?if(A12?&&?(A12+C5<=5)?&&?foo(0,B9,A12+C5,2))?return?1;

//A12倒滿B9

else?if(A12?&&?(A12+B9>9)?&&? foo(A12+B9-9,9,C5,3))?return?1;

//A12倒滿C5

else?if(A12?&&?(A12+C5>5)?&&?foo(A12+C5-5,B9,5,4))?return?1;

//B9全部倒給A12

else?if(B9?&&?(B9+A12<12)?&&?foo(A12+B9,0,C5,5))?return?1;

//B9全部倒給C5

else?if(B9?&&?(B9+C5<=5)?&&?foo(A12,0,B9+C5,6))?return?1;

//B9倒滿C5

else?if(B9?&&?(B9+C5>5)?&&?foo(A12,B9+C5-5,5,7))?return?1;

//C5全部倒給A12

else?if(C5?&&?(C5+A12<12)?&&?foo(C5+A12,B9,0,8))?return?1;

//C5全部倒給B9

else?if(C5?&&?(C5+B9<=9)?&&?foo(A12,B9+C5,0,9))?return?1;

//C5倒滿B9

else?if(C5?&&?(C5+B9>9)?&&?foo(A12,9,C5+B9-5,10))?return?1;

else

{

step--;

return?0;

}

}

int?main()

{

if(foo(12,0,0,0))?display();

}

結果:

  • 上一篇:刷客戶平臺源代碼
  • 下一篇:矢量控制是什麽意思?
  • copyright 2024編程學習大全網