演算法 3個水桶8公升水

2021-07-03 05:46:36 字數 2001 閱讀 1662

問題描述:

有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公升水,附加條件是只能這三個水桶,不能借助其他輔助容器。恩,是的,這是乙個很經典的問題。然而,我們並不能想全...