生活随笔
收集整理的這篇文章主要介紹了
UVa 10603 Fill (BFS+优先队列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給定4個數,a,b,c,d,分別代表空杯子容積為a,b,一個盛滿水的杯子容積為c,讓你不斷倒水,找一個dd,是不是存在某個時刻,某個杯子里的水dd,和d相同,或者無限接近。讓求最少的倒水量和dd(可能和d相同)。
解析:用bfs枚舉所有的狀態,就是把i里面的水倒到j里面,在這里學到了用node的優先隊列,內部書寫也是要記一記.其他代碼里面會有注釋.
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define pb push_back
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rep1(i,b,a) for(int i=b;i>=a;i--)
using namespace std;
const int maxn =
200 +
5;
struct node
{
int val[
3], d;
bool operator < (
const node &p)
const{
return d > p.d;}
};
int vis[maxn][maxn], ans[maxn];
void update(
const node &u)
{
for(
int i =
0; i <
3; ++i){
int v = u.val[i];
if(ans[v] <
0 ) ans[v] = u.d;}
}
void bfs(
int a,
int b,
int c,
int d)
{
int cap[] = {a, b, c};priority_queue<node> q;
memset(vis,
0,
sizeof(vis));
memset(ans, -
1,
sizeof(ans));node u;u.val[
0] =
0; u.val[
1] =
0;u.val[
2] = c; u.d =
0;q.push(u);vis[
0][
0] =
1;
while(!q.empty()){u = q.top(); q.pop();update(u);
if(ans[d] >=
0)
break;
for(
int i =
0; i <
3; ++i)
for(
int j =
0; j <
3; ++j){
if(i == j || !u.val[i] || u.val[j] == cap[j])
continue;node v;
memcpy(&v, &u,
sizeof(u));
int t = min(cap[j], v.val[i]+v.val[j]) - v.val[j];v.val[i] -= t;v.val[j] += t;v.d += t;
if(vis[v.val[
0]][v.val[
1]])
continue;vis[v.val[
0]][v.val[
1]] =
1;q.push(v);}}
while(d >=
0){
if(ans[d] >=
0){
cout<<ans[d]<<
' '<<d<<endl;
return ; }--d;}
}
int main()
{
int T, a, b, c, d;
cin >> T;
while(T--){
cin>>a>>b>>c>>d;bfs(a, b, c, d);}
return 0;
}
轉載于:https://www.cnblogs.com/ffgcc/p/10546452.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的UVa 10603 Fill (BFS+优先队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。