路徑搜尋問題,用bfs可以解決
這裡用來乙個二維陣列visit進行判重。
因為如果搜尋到了相同的狀態那麼第乙個水杯中的水量x1和第二個水杯中的水量x2將會相同,所以可以通過visit[x1][x2] = 1判斷這個狀態事先被訪問過,無需插入佇列中
注意這裡是要找倒水量最少的解,不是總的步數最少,所以要用優先佇列,到水量少的先出隊,所以需要操作符過載了
#include#include #include using namespace std;
const int maxn = 200+5;
struct state
};int visit[maxn][maxn];
int liter[4],d,d1;//d1記錄當前最接近d且小於d的值
state goal;//記錄找到的狀態
int from = ;
int to = ;
state pour(state s, int f, int t)
else
return s;
}void bfs()
for(int i = 1; i<= 3; i++)
}for(int i = 0; i < 6; i++)
} }}
int main()
{ int t;
cin>>t;
while(t--)
{ //初始化
memset(visit,0,sizeof(visit));
cin>>liter[1]>>liter[2]>>liter[3]>>d;
bfs();
cout<
CODEVS 倒水問題
題目描述 有兩個無刻度標誌的水壺,分別可裝 x 公升和 y 公升 x,y 為整數且均不大於 100 的水。設另有一水 缸,可用來向水壺灌水或接從水壺中倒出的水,兩水壺間,水也可以相互傾倒。已知 x 公升壺為空 壺,y 公升壺為空壺。問如何通過倒水或灌水操作,用最少步數能在x或y公升的壺中量出 z z...
題解 倒水問題
實現 題目背景 輸入輸出已更改,請不要直接提交原先的 題目描述 假定兩個水壺a和b,供水量不限。可以使用三種方法裝水 給乙個水壺裝水 把乙個水壺倒空 從乙個水壺倒進另乙個水壺。當從乙個水壺倒進另乙個水壺時,如果第乙個水壺倒空,或者第二個水壺裝滿就不能再倒了。例如,乙個水壺a是5加侖和另乙個水壺b是6...
B Pour Water倒水問題
倒水問題 fill a 表示倒滿a杯,empty a 表示倒空a杯,pour a b 表示把a的水倒到b杯並且把b杯倒滿或a倒空。輸入包含多組資料。每組資料輸入 a,b,c 資料範圍 0 a b c b 1000 a和b互質。output你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐...