题目链接

https://cn.vjudge.net/problem/UVA-10603

分析

经典的倒水问题,直接BFS.

对于喜闻乐见的状态判重,一开始想来个哈希函数把一个三元组映射成一个数,后面发现数据很小直接三维数组,后面又发现总水量是固定值,直接二维\(bool\)数组就好了

然后每次取出状态更新下答案,搜索时就是枚举将哪个杯子的水倒入哪个杯子还是很好写的,记得要状态还原

忽然发现最近只会写写水题过活了

代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <queue>
#define ll long long
#define ri register int
#define ull unsigned long long
using std::priority_queue;
using std::min;
using std::swap;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=205;
const int inf=0x7fffffff;
int ans=inf,step=0;
int a,b,c,d;
struct Sta{
int bot[3];
int sum;
Sta(){bot[0]=bot[1]=bot[2]=sum=0;}
Sta(int _x,int _y,int _z,int _sum){bot[0]=_x,bot[1]=_y,bot[2]=_z,sum=_sum;}
inline bool update(){
for(ri i=0;i<3;i++){
if(bot[i]>d)continue;
if(ans>d-bot[i]){
ans=d-bot[i];
step=sum;
}
}
if(!ans)return 1;
return 0;
}
bool operator <(const Sta &b)const{
return sum>b.sum;
}
}Tmp;
bool vis[205][205];
int size[3],now[3];
int t;
inline void bfs(){
memset(vis,0,sizeof(vis));
ans=inf,step=0;
priority_queue <Sta> q;
while(q.size())q.pop();
q.push(Sta(0,0,c,0));
vis[0][0]=1;
int x,y,z,lef,o,p;
while(q.size()){
Tmp=q.top();q.pop();
if(Tmp.update()){
printf("%d %d\n",Tmp.sum,d-ans);
return ;
}
now[0]=Tmp.bot[0],now[1]=Tmp.bot[1],now[2]=Tmp.bot[2],o=Tmp.sum;
for(ri i=0;i<3;i++){//i倒入j杯
for(ri j=0;j<3;j++){
if(!now[i]||size[j]==now[j]||i==j)continue;
lef=size[j]-now[j];
if(now[i]>=lef){
now[i]-=lef;
now[j]=size[j];
if(!vis[now[0]][now[1]]){
vis[now[0]][now[1]]=1;
q.push(Sta(now[0],now[1],now[2],o+lef));
}
now[i]+=lef;
now[j]-=lef;
}
else{
p=now[i];
now[i]=0;
now[j]+=p;
if(!vis[now[0]][now[1]]){
vis[now[0]][now[1]]=1;
q.push(Sta(now[0],now[1],now[2],o+p));
}
now[i]=p;
now[j]-=p;
}
}
}
}
printf("%d %d\n",step,d-ans);
return ;
}
int main(){
read(t);
while(t--){
read(a),read(b),read(c),read(d);
size[0]=a,size[1]=b,size[2]=c;
bfs();
}
return 0;
}

最新文章

  1. SortedList和HashTable
  2. 在Linux下禁用IPv6的方法小结
  3. angularJS 按需加载
  4. Codeforces Round #266 (Div.2) B Wonder Room --枚举
  5. C语言 数组做函数参数不传数组个数的遍历方法
  6. [转]AngularJS: 使用Scope时的6个陷阱
  7. DROP--删除表
  8. [转载]Web前端和后端之区分,以及面临的挑战
  9. TreeView绑定无限层级关系类
  10. Ajax与ashx异步请求的简单案例
  11. mvc的filter
  12. Fiddler抓取https证书问题
  13. [Codeforces Round #438][Codeforces 868C. Qualification Rounds]
  14. [深入学习Web安全](11)之XSS玩法
  15. Servlet_问题总结
  16. jquery实现图片上传前的预览
  17. go语言使用go-sciter创建桌面应用(二) ui元素查找,增加,删除,修改
  18. Nginx基本的安全优化
  19. [Spring] 学习Spring Boot之一:基本使用及简析
  20. docker学习-docker镜像

热门文章

  1. Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
  2. Linux终端Terminal常用快捷键
  3. Win10+VS2017配置pthread
  4. Git入门之在IDEA中使用Git上传maven项目
  5. Docker容器时间与主机时间相差8小时
  6. WebSocket 搭建简单聊天网站
  7. linux简单命令10---权限
  8. HashMap ArrayList 和 List对象的转换
  9. PHP上传超大文件解决方案
  10. Python-sympy科学计算与数据处理(数学表达式)