廣度優先搜尋BFS(簡單)

2021-10-22 23:31:49 字數 1418 閱讀 3863

都做過倒水的問題,有乙個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 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...