这道题目是刘汝佳白书上的例题,没有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. CharacterEncodingFilter详解及源码解析

    字符编码过滤器  (Spring框架对字符编码的处理) 基于函数回调,对所有请求起作用,只在容器初始化时调用一次,依赖于servlet容器. web.xml配置文件 <filter> &l ...

  2. window下Apache Jmeter基础用法

    1.下载Apache-jmeter-5.1.1.zip 2.解压到一个地方,就可以开始使用了,如果需要在CMD里快速打开,可以设置环境变量. 3.在bin里面,直接打开jmeter.bat. 可以修改 ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-zoom-in

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 标准C的标记化结构初始化语法

    1 struct file_operations { 2         struct module *owner; 3         loff_t (*llseek) (struct file * ...

  5. 使用Hibarnate: 出现 java.sql.SQLException: ORA-00911: 无效字符, 解决思路

    1. 查看到: Hibernat自动生成的sql查询语句 Hibernate: select * from ( select module0_.MODULE_ID as MODULE_ID1_1_, ...

  6. Problem J. Joseph’s Problem 约瑟夫问题--余数之和

    链接:https://vjudge.net/problem/UVA-1363 题意:给出n  k,当 i 属于 1~n 时 ,求解 n% i 的和 n 和 k 的范围都是 1 到 10^9; 商相同 ...

  7. Acwing199 余数之和

    原题面:https://www.acwing.com/problem/content/201/ 题目大意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 ...

  8. 2.10 学习总结 之 JQ加强

    一.说在前面  昨天 完成了体温统计APP的编写 今天 学习json数据结构 二.学习总结 1.json数据结构 1)什么是json: JSON(JavaScript Object Notation) ...

  9. 019-PHP创建目录函数

    <?php if (mkdir("myDir1", 0777)) //创建目录的函数 { print("目录创建成功"); //目录建立成功 } else ...

  10. JS确认取消按钮使用

    前几天写程序用到了点击提交之后弹出一个信息框确认提交有取消和确定按钮查阅了资料记录一手 if(window.confirm('你确定要提交吗?提交后将无法更改!')){ //这里填写提交代码 retu ...