UVA_10603 倒水问题 隐式图搜索
这道题目是刘汝佳白书上的例题,没有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 倒水问题 隐式图搜索的更多相关文章
- 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)
这道题用到了很多知识点, 是一道好题目. 第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算. 第二这里是隐式 ...
- uva 10274 Fans and Gems(隐式图搜索+模拟)
Fans and Gems Input: Standard Input Output: Standard Output Tomy's fond of a game called 'Fans and G ...
- [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索
[HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...
- 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& ...
- 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- uva10603-倒水问题-暴力枚举-隐式图搜索
题意: 给你三个杯子,a,b,c,没有刻度,刚开始c杯是满的,倒水的要求,要么倒出水的杯子倒空,要么倒入杯子倒满. 结果: 要求某个杯子内有d水量,并且倒出的水量最少,如果倒不出d水量,那么倒出d1( ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
- uva 310 L--system(隐式图搜索+字符串处理)
L-system A D0L (Deterministic Lindenmayer system without interaction) system consists of a finite ...
随机推荐
- IDE及PHP基础——注释、变量、数据、运算符、输出等
IDE(Integrated Development Environment ),集成开发环境,是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调试器和图形用户界面等工具.集成了代码编写 ...
- window 如何访问虚拟机的mapreduce(遇到的坑)
首先 先把你虚拟机和本机网络链接弄通 (详情看上一篇) 一些关于mapreduce 和hadoop的配置都在上一篇 安装eclipse 的hadoop Map/Reduce插件详情 看其他博客园.. ...
- DevOps - 不适用
章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...
- JD-Store购物网站复盘——20170312
一.商店技术架构 1.主题 2.涉及技术点: 3.核心业务功能 4.角色 5.用户故事 二.实现步骤 专案基础设施 上传图片模块 购物车 订单 支付&寄信 专案源码 三.第三方服务应用 支付 ...
- 3D打印技术的火爆,真的会让传统模具行业没落吗?
当一种新生事物出现时,人们除了赞美它带来的新畅想外,往往还会对"旧事物"贬低几分--各种淘汰观点总是不绝于耳.但可惜的是,新生事物取代旧事物的事儿并不会必然发生.比如,直到现在广播 ...
- cf 762C. Two strings
因为要删去1个串(读错题),所以就直接二分搞就好了. 需要预处理出2个分别从头到尾,或从尾到头需要多长a串的数组,然后二分删去多长就好了. #include<bits/stdc++.h> ...
- 14 SQLite数据库
SQLite数据库SQLite 是一款轻型的数据库SQLite 的设计目标是嵌入式的SQLite 占用资源低SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机 ...
- Docker 和虚拟机的区别
版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...
- junit基础学习之-多线程测试(6)
步骤: 1.定义单个TestRunner 2.重载单个TestRunner的runTest() 3.定义TestRunner数组,并添加多个TestRunner 4.MultiThreadedTest ...
- vim使用技巧(常用指令)
1. vim基础操作 vim是从 vi 发展出来的一个文本编辑器 .代码补完.编译及错误跳转等做了一些增强 1.1 进入编辑模式 命令 含义 i和I i在光标前插入,I在行首插入. a和A a在光标后 ...