1. 程式人生 > >[BFS] POJ 3414

[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 3414BFS

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)