[BFS] POJ 3414
bfs加上回溯
注意要儲存每一個節點
一開始只建了兩個節點就回溯不能了,還得全改成指標非常麻煩
再就是因為優先佇列的問題debug了很久,拿指標簡直是災難hhh
開始寫的Node優先順序比較的函式對指標不適用,改成普通的queue就好了
~~~
不是抄別人的程式碼太好了hhh
#include <cstdlib> #include <cstring> #include <iostream> #include <queue> #define N 1000 using namespace std; struct Node { int a, b; int cnt; int pre_oper; Node *prenode; //介個沒有用。。。 // bool operator< ( const Node t ) const { return cnt > t.cnt; } Node () { a = b = cnt = pre_oper = 0; prenode = NULL; } Node ( const Node *t ) { a = t->a; b = t->b; cnt = t->cnt; pre_oper = t->pre_oper; prenode = t->prenode; } } * log; int sa, sb, required; bool visit[ N ][ N ]; void operate ( Node *cur, Node *nex, int i ) { switch ( i ) { case 1: { nex->a = sa; break; } case 2: { nex->b = sb; break; } case 3: { nex->a = 0; break; } case 4: { nex->b = 0; break; } case 5: { nex->a = min ( sa, cur->a + cur->b ); nex->b = cur->b - ( nex->a - cur->a ); break; } case 6: { nex->b = min ( sb, cur->b + cur->a ); nex->a = cur->a - ( nex->b - cur->b ); break; } } } int bfs () { Node *c = new Node (); memset ( visit, false, sizeof ( visit ) ); visit[ 0 ][ 0 ] = true; queue<Node *> q; q.push ( c ); while ( !q.empty () ) { Node *cur = q.front (); q.pop (); if ( cur->a == required || cur->b == required ) { log = cur; return cur->cnt; } for ( int i = 1; i <= 6; ++i ) { //要儲存每一個節點 Node *nex = new Node ( cur ); operate ( cur, nex, i ); nex->cnt = cur->cnt + 1; nex->pre_oper = i; nex->prenode = cur; if ( !visit[ nex->a ][ nex->b ] ) { visit[ nex->a ][ nex->b ] = true; q.push ( nex ); } } } return -1; } string opt[ 7 ] = {" ", "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(2,1)", "POUR(1,2)"}; void output ( Node *c ) { if ( c->pre_oper == 0 ) { return; } output ( c->prenode ); cout << opt[ c->pre_oper ] << endl; } int main () { while ( cin >> sa >> sb >> required ) { int sol = bfs (); if ( sol == -1 ) cout << "impossible" << endl; else { cout << sol << endl; output ( log ); } } return 0; }
相關推薦
[BFS] POJ 3414
bfs加上回溯 注意要儲存每一個節點 一開始只建了兩個節點就回溯不能了,還得全改成指標非常麻煩 再就是因為優先佇列的問題debug了很久,拿指標簡直是災難hhh 開始寫的Node優先順序比較的函式對指標不適用,改成普通的queue就好了 ~~~ 不是抄別人的程式碼太好了hh
POJ 3414 (BFS)
class cout () amp esp cst LV pan span 這道題還是比較簡單的,就是寫起來有點麻煩,剛開始做的時候一直一位有什麽簡單方法,拖了好久。。。還是自己分析問題的能力不行啊 1 #include<iostream> 2 #i
poj 3414 Pots(廣搜BFS+路徑輸出)
contents imp 進行 ace main 數組 ems string oid 轉載請註明出處:http://blog.csdn.net/u012860063?viewmode=contents 題目鏈接:http://poj.org/problem?id=3414
POJ 3414 Pot (輸出路徑)【BFS】
至少 ret ref string 狀況 nod size 推導 blank <題目鏈接> 題目大意: 有兩個容量的空杯子,能夠對這兩個空杯子進行三種操作: 分別是fill(a),裝滿a杯子; drop(a),倒空a杯子; pour(a,b),將a杯子中的水倒入
POJ-3414 Pots(兩個杯子倒水問題) 【BFS】
題目傳送門 題目: 給你兩個杯子a,b,容量分別是A和B。可以執行以下操作: 1.FILL(i):將i倒滿水。 2.DROP(i):將i倒空水。 3.POUR(i,j): 將ipot的水倒到jpot上,直至要麼ipot為空,要麼jpot為滿。 求能否在一定步數的操作後,使得a,b
POJ 3414 bfs
給你兩個容量為A和B的空水杯,要你通過3種操作(程式中分為了6種)來實現A或B杯中有一個杯子中的水是C升。 三種操作為: &
POJ 3414 Pots (BFS/DFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7783
poj 3414 Pots (bfs+路徑記錄)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10071 Accepted: 4237 Special Judge Description You are given two
poj 3414 Pots(bfs+輸出回溯路徑)
給你兩個容器,分別能裝下A升水和B升水,並且可以進行以下操作 FILL(i) 將第i個容器從水龍頭裡裝滿(1 ≤ i ≤ 2); DROP(i) 將第i個容器抽乾 POUR(i,j) 將第i個容
poj 3414 Pots-bfs
ron net str ios stream n) class clu iostream 題目鏈接:http://poj.org/problem?id=3414 參考博客:https://blog.csdn.net/tigerisland45/article/detail
POJ 3414 Pots 均分水(bfs)
題目連結: 題目大意: 有兩個水杯,一開始都沒有裝水,給出兩個水杯的容量,和要達到的目標容量 每個水被有三種操作:1.裝滿水,2.倒掉所有水,3,將水倒入另一個杯子中. 思路: 兩個杯子,六種操作,,求最短路,並列印路徑,6入口b
POJ ~ 3414 ~ Pots (BFS+列印路徑)
題意:有兩個無刻度的容量分別為A,B升的杯子,通過一些操作使某一個杯子中有C升的水。 1. FILL(i) ,將i這個杯子中的水接滿 2. DROP(i),將i這個杯子中的水倒掉 3. POUR(i,j),將i這個杯子中的水倒入j這個杯子,能倒完就倒完,倒不完就留在杯子中。
poj 3414 路徑輸出的bfs(pre)
#include <iostream> #include <algorithm> usingnamespace std; #include <cstring>
POJ 3414 Pots(bfs)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17456 Accepted: 7407 Special Judge Description You are given two
POJ-3414 POTS(BFS列印路徑)
問題描述 You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i
poj 3414 bfs 兩個壺倒水,記錄路徑
題意:給你兩個壺,容量分別為a,b,初始都是0,再給你一個目標水量c,問經過幾次操作可以使得其中一個壺的水量為目標水量c,並且把操作步驟輸出。 6個操作: 1、FILL(1)//FILL(i),把 i 壺裝滿 2、FILL(2) 3、DROP(1)//DROP(i),把 i
POJ-3414-Pots(BFS 模擬)
H - Pots Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3414 App
POJ 3414 Pots(BFS記錄路徑)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10085 Accepted: 4245 Special Judge Description You are given two p
超超超簡單的bfs——POJ-3278
ber str ted stdio.h bsp front epo hint fast Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 89836 Acc
POJ 3414 -- Pots
沒有 chan pan mov 父節點 以及 表示 不可 http POJ 3414 -- Pots 題意: 給出了兩個瓶子的容量A,B, 以及一個目標水量C, 對A、B可以有如下操作: FILL(i) fill the pot i (1 ≤ i ≤ 2)