問題描述:
有3個水桶的容量為8公升,5公升和3公升。
8公升水桶裡面裝滿了水。如果利用另外兩個桶,得到4公升水?
思路:
水桶裡的水量看作是狀態。倒水的動作,使得狀態變遷。
遍歷所有的倒水動作,得到所有的狀態。
因此問題就變成,如何從初始狀態(8,0,0),經過倒水動作的觸發,得到最終狀態(4,4,0)?
利用對所有狀態的分析,想到所有的狀態,可以以樹的形式表示。遍歷狀態樹可以用廣度,也可以用深度優先搜尋。
因為要得到倒水的序列,想到用深度優先搜尋的方式來遍歷解空間。
深度搜尋可能會遇到環,因此利用deque儲存以前搜尋過的狀態,如果搜尋過了,則跳過。這是一種剪枝的方法。
#ifndef _bucket_h_
#define _bucket_h_
#ifdef __cplusplus
extern "c" ;
int buckets_dump_water_demo();
#ifdef __cplusplus
}#endif
#endif
#include
#include
#include
#include
#include "bucket.h"
using
namespace
std;
int bucket_init_state[buckets_count] = ;
int bucket_final_state[buckets_count] = ;
int bucket_capicity[buckets_count] = ;
void printstates(bucketstate& cur_state)
cout
<< endl;
}void print_result(deque
& state)
cout
<< endl << endl;
return;
}int is_same_bucket_state(bucketstate& state1, bucketstate& state2)
}return1;}
int is_exist(deque
& state, bucketstate& cur_state)
}return0;}
int can_dump_water(bucketstate& cur_state, int from, int to, bucketstate& next_state)
if ((cur_state.bucket_s[from] + cur_state.bucket_s[to]) >= bucket_capicity[to])
else
return
1; }
return0;}
void search_state(deque
& state);
void search_action(deque
& state, bucketstate& cur_state, int from, int to)
if (!is_exist(state, next))
return;
}int is_final_state(bucketstate& cur_state)
}return1;}
void search_state(deque
& state)
int i = 0;
int j = 0;
for (i = 0; i < buckets_count; i++)
}}int buckets_dump_water_demo()
states.push_back(init_buckets);
search_state(states);
return
0;}
參考:《演算法的樂趣》
**:
三個水桶等分8公升水的問題
有三個容積分別為8公升 5公升 3公升的水桶,其中容積為8公升的水桶盛滿了水,容積為5公升和3公升的水桶都是空的。三個水桶都沒有刻度,現在需要將水桶中的8公升水等分成2份,每份都是4公升水。條件是只能使用這三個水桶,不能借助其他工具。對於這個問題,似乎沒有 規律 可循,沒有專門的演算法來求解,因此只...
3個桶均分8公升水 c
結果 3個桶,分別為8l,5l,3l。初始狀態8l的桶裡滿水,另外2個桶空。過程中只能將乙個桶向另乙個桶,倒滿或者倒空水,求所有將8l水均分為4l 4l的方案,並展示倒水過程。include using namespace std 8l,5l,3l水桶,將8l公升水均分為4,4,求所有方案 定義un...
三個容器倒水 三個水桶等分8公升水的問題 演算法的樂趣
有三個容積分別為3公升 5公升 8公升的水桶,其中容積為8公升的水桶中裝滿了水,容積為3公升和容積為5公升的水桶都是空的。三個水桶都沒有刻度,現在需要將大水桶中的8公升水等分成兩份,每份都是4公升水,附加條件是只能這三個水桶,不能借助其他輔助容器。恩,是的,這是乙個很經典的問題。然而,我們並不能想全...