题目描述 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 ;
}

最新文章

  1. NYOJ之字符串逆序输出
  2. python数据采集与多线程效率分析
  3. NOIP201208同余方程
  4. Qt可执行程序写入版本信息
  5. 关于c语言char类型输入输出的一个bug
  6. redis远程连接超时
  7. 关于Redis的知识汇总[转]
  8. Linux系统编程(5)——文件与IO之mmap函数
  9. PAT1010
  10. iOS 发布流程 分类: ios相关 app相关 2015-05-22 14:50 186人阅读 评论(0) 收藏
  11. Java Hash集合的equals()与hashCode() 方法
  12. TensorFlow的封装
  13. springboot打war包需要注意事项
  14. swift - 添加定时器
  15. 【转】字符编码笔记:ASCII,Unicode 和 UTF-8
  16. 图片标注工具LabelImg使用教程
  17. To 初识Java的小菜菜们 嘻嘻~
  18. HTML&amp;CSS 学习网站收藏【转】
  19. Openerp 修改 tree view 的列宽
  20. 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest Problem L. Lazy Coordinator

热门文章

  1. json和Jsonp 使用总结(2)
  2. [C和指针] 1-快速上手、2-基本概念、3-数据
  3. RHEL5.6更新yum源
  4. 设计基于HTML5的APP登录功能及安全调用接口的方式
  5. Modbus通讯协议简介
  6. 6.12---知道参数的重要性------插入数据-删除数据-修改数据注意Map
  7. 介绍Git的17条基本用法
  8. ubuntu16.04安装teamviewer12
  9. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
  10. Spring框架系列(二)--装配和注入Bean