#include#includeconst int maxn = 110;
int vis[maxn][maxn]; //標記狀態是否入隊過
int a,b,c; //容器大小
int step; //最終的步數
int flag; //紀錄是否能夠成功
/* 狀態紀錄 */
struct statusq[maxn*maxn];
int id[maxn*maxn]; //紀錄最終操作在佇列中的編號
int lastindex; //最後乙個的編號
void bfs()
for(int i = 1; i <= 6; i++) //分別遍歷 6 種情況
else if(i == 2) //fill(2)
else if(i == 3) //drop(1)
else if(i == 4) // drop(2);
else if(i == 5) //pour(1,2)
else //如果能夠裝滿 b
}else if(i == 6) // pour(2,1)
else //如果能夠裝滿 b
}next.op = i; //紀錄操作
if(!vis[next.k1][next.k2]) //如果當前狀態沒有入隊過}}
}}int main()
for(int i = 1; i <= step; i++)
}else printf("impossible\n");
}return 0;
}
poj解題報告 3414
題目大意 有二個水壺,對水壺有三種操作,1 fill i 將i水壺的水填滿,2 drop i 將水壺i中的水全部倒掉,3 pour i,j 將水壺i中的水倒到水壺j中,若水壺 j 滿了,則 i 剩下的就不倒了,問進行多少步操作,並且怎麼操作,輸出操作的步驟,兩個水壺中的水可以達到c這個水量。如果不可...
poj 3414 倒水問題 bfs
思路 就是bfs,有六種操作,fill 1或2,drop 1或2 將1倒到2,將2倒到1。要注意的是要使用標記陣列vis i j 表示左邊的杯子為i公升,右邊的杯子為j公升,如果已被標記說明之前已經出現這種情況,就不要入隊。從 0,0 開始bfs。因為題目中需要輸出如何倒,那麼就需要儲存路徑。以前似...
搜尋 poj3414倒水問題
題意 給出a,b兩個水杯的容量,和乙個要達到的水量c。總共3種操作,兩個杯子那就是六種。要求通過這六種操作來時兩個杯子其中有乙個水量為c的最少運算元。解題思路 這道題用到的是廣搜bfs,水量 i,j 代表乙個點,通過這六種操作可以變成另乙個點,那麼這兩個點之間就是有路的,每個點有沒有訪問過用鄰接矩陣...