这道题目是刘汝佳白书上的例题,没有LRJ在白书上提到的划归为搜索问题,还真是一时难以想到好的解法。即三个瓶子,任意的一个状态都是一个节点,最后就划归为一个搜索问题。

由于题目数据量不大,三个杯子容量都不超过200,所以用个vis三维数组保存下访问过得状态以达到剪枝的目的,不过我在想数据量稍微大一点,这个数组就开不下了,同时搜索时间将大大增加。。。所以面对大数据的时候有没有更好的方法,我暂时还没想到。

代码写得超级挫,每个状态的转化都是手动敲的,好像可以用一个函数统一解决,当时写的时候就比较急,就直接手敲了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define INF 1<<31;
using namespace std;
int vis[][][];
int a,b,c,d;
struct node{
int a1,b1,c1;
int minw;
void init(int a,int b,int c)
{
a1=a;b1=b;c1=c;
}
};
node ans;
bool judge(node xq)
{
int q1,q2,q3;
q1=xq.a1-d;
q2=xq.b1-d;
q3=xq.c1-d; q1=q1>= ? q1 : -q1;
q2=q2>= ? q2 : -q2;
q3=q3>= ? q3 : -q3;
int ansq=min(q1,min(q2,q3));
int c1,c2,c3;
c1=ans.a1-d;
c2=ans.b1-d;
c3=ans.c1-d;
if (c1<) c1=-c1;
if (c2<) c2=-c2;
if (c3<) c3=-c3;
int ansc=min(c1,min(c2,c3)); if (ansq<ansc) return ;
if (ansq==ansc)
{
if (xq.minw<ans.minw) return ;
}
return ; }
void bfs(node xq)
{
queue<node>q;
q.push(xq);
while (!q.empty())
{
node x=q.front();
q.pop();
if (vis[x.a1][x.b1][x.c1]) continue;
vis[x.a1][x.b1][x.c1]=;
if (judge(x)) ans=x;
node t1;
int temp;
if (x.a1>){
t1=x;
if (x.b1<b){
temp=min(b-x.b1,x.a1);
t1.a1-=temp;
t1.b1+=temp;
t1.minw+=temp;
q.push(t1);
}
t1=x;
if (x.c1<c){
temp=min(c-x.c1,x.a1);
t1.a1-=temp;
t1.c1+=temp;
t1.minw+=temp;
q.push(t1);
}
}
if (x.b1>){
t1=x;
if (x.a1<a)
{
temp=min(a-x.a1,x.b1);
t1.b1-=temp;
t1.a1+=temp;
t1.minw+=temp;
q.push(t1);
}
t1=x;
if (x.c1<c){
temp=min(c-x.c1,x.b1);
t1.b1-=temp;
t1.c1+=temp;
t1.minw+=temp;
q.push(t1);
}
}
if (x.c1>){
t1=x;
if (x.a1<a){
temp=min(a-x.a1,x.c1);
t1.c1-=temp;
t1.a1+=temp;
t1.minw+=temp;
q.push(t1);
}
t1=x;
if (x.b1<b){
temp=min(b-x.b1,x.c1);
t1.c1-=temp;
t1.b1+=temp;
t1.minw+=temp;
q.push(t1);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
memset(vis,,sizeof vis);
node first;
first.init(,,c);
first.minw=;
ans=first;
ans.minw=INF;
bfs(first);
int tq[];
tq[]=ans.a1;
tq[]=ans.b1;
tq[]=ans.c1;
sort(tq+,tq+);
int w;
for (w=;w>=;w--)
{
if (tq[w]<=d) break;
}
printf("%d %d\n",ans.minw,tq[w]); }
return ;
}

UVA_10603 倒水问题 隐式图搜索的更多相关文章

  1. 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)

    这道题用到了很多知识点, 是一道好题目.      第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算.     第二这里是隐式 ...

  2. uva 10274 Fans and Gems(隐式图搜索+模拟)

    Fans and Gems Input: Standard Input Output: Standard Output Tomy's fond of a game called 'Fans and G ...

  3. [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索

    [HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...

  4. UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  6. 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  7. uva10603-倒水问题-暴力枚举-隐式图搜索

    题意: 给你三个杯子,a,b,c,没有刻度,刚开始c杯是满的,倒水的要求,要么倒出水的杯子倒空,要么倒入杯子倒满. 结果: 要求某个杯子内有d水量,并且倒出的水量最少,如果倒不出d水量,那么倒出d1( ...

  8. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  9. uva 310 L--system(隐式图搜索+字符串处理)

     L-system  A D0L (Deterministic Lindenmayer system without interaction) system consists of a finite ...

随机推荐

  1. DOM基础2——元素

    1.造元素 document.createElement("标签名") 例:var div_new=document.createElement("div"); ...

  2. POJ 3090 欧拉函数

    求一个平面内可见的点,其实就是坐标互质即可,很容易看出来或者证明 所以求对应的欧拉函数即可 #include <iostream> #include <cstdio> #inc ...

  3. 自己写个tween

    public Vector3 begin,end;//起始终止坐标 public float BtoE_time;//用时 float timer,lerp;//计时器和进度值 void Update ...

  4. P1046 划拳

    P1046 划拳 转跳点:

  5. LINUX——LVM逻辑卷管理

    LVM: logical volumes manager LVM逻辑卷部署 物理卷—>卷组—>逻辑卷 第一步:关机添加磁盘:两个磁盘可以构成一个磁盘组. 第二步:查看磁盘 # ls /de ...

  6. 054-for循环

    <?php for($i=1;$i<=5;$i++){ echo "$i<br />"; //循环体 } ?>

  7. 一个swift版简单的用户名和密码输入textField

    http://www.code4app.com/thread-31992-1-1.html 常见的动画提交按钮 http://www.code4app.com/thread-32239-1-1.htm ...

  8. Docker部署Python应用程序

    Docker部署Python应用程序 1. 单个py文件部署 生成Dockerfile 文件 插件用的豆瓣的镜像,,重置时间(容器的默认时间是UTC时间与宿主机的相差8小时). 文中需要三个插件(pe ...

  9. SpringBoot学习(五)——Profile

    Profile是Spring对不同环境(例如开发人用开发环境,测试人员用测试环境)提供不同配置功能的支持,可以通过激活,指定参数等方式快速切换环境 1.多profile文件形式 格式:applicat ...

  10. C#如何编写短信接口,以及接口的调用,包括C#.net访问web,并处理返回值的简例。

    在系统的开发中我们经常会用到接口,下面给大家介绍一种短信接口的编写与调用. 我们常调用接口来完成一些信息的通知或者发送验证码,那么这些操作是如何完成的呢?来看一下详细的介绍吧! 首先呢,我们需要有一个 ...