搜尋 九度1457 BFS 好題

2021-07-27 09:12:52 字數 1792 閱讀 6122

【2017/2/24】

題目-非常可樂:

題意:三個杯子,容量滿足

a = b + c 且 b != c

初始時 a中裝滿可樂,通過三個瓶子互相傾倒,平分可樂

思路:bfs()搜尋狀態【狀態定義: 每個瓶子中所裝可樂的量】

注意:不能先喝一部分,必須要得到平分狀態,即 瓶子和大杯子 各裝了一半可樂

感觸:在寫狀態轉移函式時,把兩個賦值語句的順序寫反了,導致整整調了幾個小時。是自己寫**太粗糙了,同時也反映出debug的能力亟待提高!fighting!

#include#includeusing namespace std;

bool mark[105][105][105]; //記錄此狀態是否已出現過

int success = 0;

struct point ;

queueque;

void atob(int &nowa, int am, int &nowb, int bm)

else

}void bfs(int s, int

max, int

min)

//依次搜尋六種可能狀態

//s 倒入 max

a = now.s; //置初始變數

b = now.max;

c = now.min;

atob(a, s, b, max);

if (false == mark[a][b][c])

//s 倒入 min

a = now.s; //置初始變數

b = now.max;

c = now.min;

atob(a, s, c, min);

if (false == mark[a][b][c])

// max 倒入 min

a = now.s; //置初始變數

b = now.max;

c = now.min;

atob(b, max, c, min);

if (false == mark[a][b][c])

// min 倒入 max

a = now.s; //置初始變數

b = now.max;

c = now.min;

atob(c, min, b, max);

if (false == mark[a][b][c])

// max 倒入 s

a = now.s; //置初始變數

b = now.max;

c = now.min;

atob(b, max, a, s);

if (false == mark[a][b][c])

// min 倒入 s

a = now.s; //置初始變數

b = now.max;

c = now.min;

atob(c, min, a, s);

if (false == mark[a][b][c])

}}int main()

}if (0 == (s % 2)) bfs(s, m, n); //只有偶數可平分

else success = 0;

if (0 == success) printf("no\n");

else printf("%d\n", success);

}return

0;}

非常可樂 九度 OJ 1457

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 題目描述 大家一定覺得運動以後喝可樂是一件很愜意的事情,但是 seeyou 卻不這麼認為。因為每次當 seeyou 買了可樂以後,阿牛就要求和 seeyou 一起分享這一瓶可樂,而且一定要喝的和 seeyou 一樣多。但 seeyou 的手中只有...

搜尋 九度1461 DFS

題目tempter of the bone 題意 有乙個n m的迷宮,包括起點s,終點d,牆x和地面,0秒時主人公從s出發,每秒能走到與其相鄰的位置中的乙個,且每個位置被行走之後都不能再次走入,問是否存在這樣一條路徑使主人公在 t 秒時剛好走到d 注意點 每次dfs 後一定要恢復 點的可訪問性 in...

DFS和BFS 解棋盤遊戲(九度OJ 1091)

dfs利用遞迴,不必使用多餘的資料結構,實現簡單。但要注意剪枝。bfs借助佇列,往往在求最優解時使用。總是能找到最優解,某些情況下也要剪枝。這兩種方法根據具體問題來使用。以此題為例,dfs和bfs都可求解。由於是求最優解,用bfs更為直接。由於此題的不確定性,必須要考慮所有可能情況,結合剪枝。題目1...