【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...