codevs1226 倒水问题
2024-08-30 23:25:08
题目描述 Description
有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来。
输入描述 Input Description
一行,三个数据,分别表示 x,y 和 z;
输出描述 Output Description
一行,输出最小步数 ,如果无法达到目标,则输出"impossible"
样例输入 Sample Input
3 22 1
样例输出 Sample Output
14
思路:
普通广搜
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define maxn 100000
using namespace std;
struct sta{
int x;
int y;
int step;
int frm;
};
int mx,my,z,j[][],solved = ;
sta temp;
void input(){
cin>>mx>>my>>z;
temp.x = temp.y = temp.step = ;
temp.frm = -;
}
sta expand(sta a,int sign){
if(sign == ) a.x = ;
if(sign == ) a.y = ;
if(sign == ) a.x = mx;
if(sign == ) a.y = my;
if(sign == ){
int d;
if(mx - a.x < a.y) d = mx - a.x;
else d = a.y;
a.y -= d;
a.x += d;
}
if(sign == ){
int d;
if(my - a.y < a.x) d = my - a.y;
else d = a.x;
a.y += d;
a.x -= d;
}
a.frm = sign;
a.step++;
if(j[a.x][a.y]) a.step = -;
j[a.x][a.y] = ;
return a;
}
void bfs(){
sta q[maxn];
int h = ,t = ;
q[h] = temp;
while(h != t){
if(q[h%maxn].x == z || q[h%maxn].y == z) {
cout<<q[h%maxn].step<<endl;
solved = ;
break;
}
for(int i = ;i <= ;i++){
if(i == && (q[h%maxn].x == ||q[h%maxn].frm == )) continue;
if(i == && (q[h%maxn].y == ||q[h%maxn].frm == )) continue;
if(i == && (q[h%maxn].x == mx ||q[h%maxn].frm == )) continue;
if(i == && (q[h%maxn].y == my ||q[h%maxn].frm == )) continue;
if(i == && (q[h%maxn].y <= || q[h%maxn].x >= mx || q[h%maxn].frm == )) continue;
if(i == && (q[h%maxn].x <= || q[h%maxn].y >= my || q[h%maxn].frm == )) continue;
temp = expand(q[h%maxn],i); if(temp.step != -) {
t++;
q[t%maxn] = temp; }
}
h++;
}
}
int main(){
input();
if(z > mx || z > my || !mx || !my || (mx == my && mx != z)){
cout<<"impossible"<<endl;
return ;
}
bfs();
if(!solved) cout<<"impossible"<<endl;
return ;
}
最新文章
- NYOJ之字符串逆序输出
- python数据采集与多线程效率分析
- NOIP201208同余方程
- Qt可执行程序写入版本信息
- 关于c语言char类型输入输出的一个bug
- redis远程连接超时
- 关于Redis的知识汇总[转]
- Linux系统编程(5)——文件与IO之mmap函数
- PAT1010
- iOS 发布流程 分类: ios相关 app相关 2015-05-22 14:50 186人阅读 评论(0) 收藏
- Java Hash集合的equals()与hashCode() 方法
- TensorFlow的封装
- springboot打war包需要注意事项
- swift - 添加定时器
- 【转】字符编码笔记:ASCII,Unicode 和 UTF-8
- 图片标注工具LabelImg使用教程
- To 初识Java的小菜菜们 嘻嘻~
- HTML&;CSS 学习网站收藏【转】
- Openerp 修改 tree view 的列宽
- 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest Problem L. Lazy Coordinator
热门文章
- json和Jsonp 使用总结(2)
- [C和指针] 1-快速上手、2-基本概念、3-数据
- RHEL5.6更新yum源
- 设计基于HTML5的APP登录功能及安全调用接口的方式
- Modbus通讯协议简介
- 6.12---知道参数的重要性------插入数据-删除数据-修改数据注意Map
- 介绍Git的17条基本用法
- ubuntu16.04安装teamviewer12
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
- Spring框架系列(二)--装配和注入Bean