都做過倒水的問題,有乙個3公升和5公升的水桶和無限的水,現在要求桶中恰好裝入4公升水。poj3414就是這類的倒水問題,給你兩個桶,容量為a,b。現在要求稱出c公升水。(1<=a,b<=100,c<=max(a,b))
並且要使操作次數最少,列印最少次數和操作。
操作次數最少,顯然是廣度優先搜尋可以快速達到要求。對於兩個桶的狀態,它一共有六種操作:把a倒滿,把b倒滿,把a清空,把b清空,把a中的水倒入b,把b中的水倒入a。這樣搜尋就是搜尋一棵6叉樹,注意儲存路徑(每個狀態都有乙個父狀態)。
#include using namespace std;
const int max = 100000;
short a,b,c;
int length;
bool flag[101][101];
typedef struct
condition;
condition queue[max];
int k = -1;
void print(int p)
if(p == -1)
if(queue[p].op == 1)
printf("fill(%d)\n", queue[p].s);
if(queue[p].op == 2)
printf("drop(%d)\n", queue[p].s);
if(queue[p].op == 3)
printf("pour(%d,%d)\n", queue[p].s, queue[p].e);
}int main()
//6種操作:把1填滿,把2填滿,把1倒空,把2倒空,把1的水倒入2,把2的水到入1
condition adj1;
adj1.a = a;
adj1.b = b;
if(!flag[a][b])
adj1.a = a;
adj1.b = b;
if(!flag[a][b])
adj1.a = 0;
adj1.b = b;
if(!flag[0][b])
adj1.a = a;
adj1.b = 0;
if(!flag[a][0])
adj1.a = a + b - b;
if(adj1.a < 0)
else
if(!flag[adj1.a][adj1.b])
adj1.b = a + b - a;
if(adj1.b < 0)
else
if(!flag[adj1.a][adj1.b])
}if(tag)
print(head - 1);
else
cout<<"impossible\n";
return 0;
}
參見poj3414 廣度優先搜尋,簡單bfs
前兩篇文章主要是深度優先搜尋,這次是廣度 寬度 優先搜尋,還是上次的問題現在用bfs來解決,題目 有一天,小哈乙個人去玩迷宮,但是方向感很差的小哈很快就迷路了,小哼得知後,便立即去解救被困的小哈,小哼自然是有備而來,已經弄清楚了迷宮的地圖,現在小哼要以快的速度去解救小哈。問題就此開始了。迷宮由n行和...
BFS廣度優先搜尋
廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...
bfs廣度優先搜尋
這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...