博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeVS 1226 倒水问题【DFS/BFS】
阅读量:5099 次
发布时间:2019-06-13

本文共 2914 字,大约阅读时间需要 9 分钟。

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

数据范围及提示 Data Size & Hint

广度优先搜索 深度优先搜索 迭代搜索 搜索

【DFS:】

#include
#define debug() puts("++++")#define gcd(a,b) __gcd(a,b)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define fi first#define se second#define pb push_back#define sqr(x) ((x)*(x))#define ms(a,b) memset(a,b,sizeof(a))#define sz size()#define be begin()#define pu push_up#define pd push_down#define cl clear()#define lowbit(x) -x&x#define all 1,n,1#define rep(i,n,x) for(int i=(x); i<(n); i++)#define in freopen("in.in","r",stdin)#define out freopen("out.out","w",stdout)using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pair
P;const int INF = 0x3f3f3f3f;const LL LNF = 1e18;const int maxn = 1e3 + 20;const int maxm = 1e6 + 10;const int N = 1e4+10;const double PI = acos(-1.0);const double eps = 1e-8;const int dx[] = {-1,1,0,0,1,1,-1,-1};const int dy[] = {0,0,1,-1,1,-1,1,-1};int dir[][3]={ {0,0,1},{0,0,-1},{1,0,0},{-1,0,0},{0,1,0},{0,-1,0} };const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int f[200][200],a,b,z;void dfs(int x,int y,int step){ if(f[x][y]!=0 && step+1>=f[x][y]) return ; f[x][y]=step+1; dfs(x,0,step+1); dfs(0,y,step+1); dfs(x,b,step+1); dfs(a,y,step+1); if(x+y<=a) dfs(x+y,0,step+1); else dfs(a,x+y-a,step+1); if(x+y<=b) dfs(0,x+y,step+1); else dfs(x+y-b,b,step+1);}int main(){ while(~scanf("%d%d%d",&a,&b,&z)) { memset(f,0,sizeof(f)); int ans=INF; dfs(0,0,0); for(int i=0;i<=a;i++) { if(f[i][z]!=0) { if(f[i][z]

【BFS】:

#include
#include
#include
#include
#include
using namespace std;int x,y,target;struct state{ int x,y,step;}f;queue
q;bool vis[233][233];int bfs(){ q.push(f); vis[f.x][f.y]=1; while(q.size()) { f=q.front(); q.pop(); if(f.x==target||f.y==target) return f.step; if(f.x
=y-f.y&&vis[f.x-(y-f.y)][y]==0)//x->y { q.push((state){f.x-(y-f.y),y,f.step+1}); vis[f.x-(y-f.y)][y]=1; } if(f.x
y { q.push((state){0,f.x+f.y,f.step+1}); vis[0][f.x+f.y]=1; } if(f.y>=x-f.x&&vis[x][f.y-(x-f.x)]==0)//y->x { q.push((state){x,f.y-(x-f.x),f.step+1}); vis[x][f.y-(x-f.x)]=1; } if(f.y
x { q.push((state){f.x+f.y,0,f.step+1}); vis[f.x+f.y][0]=1; } } return -1;}int main(){ scanf("%d%d%d",&x,&y,&target); int ans=bfs(); if(ans!=-1) printf("%d",ans); else printf("impossible"); return 0;}

转载于:https://www.cnblogs.com/Roni-i/p/9288043.html

你可能感兴趣的文章
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
支持向量机——内核
查看>>
MFC注册热键
查看>>
万能的SQLHelper帮助类
查看>>
uboot分析:uboot的启动过程分析
查看>>
tmux的简单快捷键
查看>>
springboot笔记04——读取配置文件+使用slf4j日志
查看>>
[Swift]LeetCode653. 两数之和 IV - 输入 BST | Two Sum IV - Input is a BST
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
微信小程序的wxml文件和wxss文件在webstrom的支持
查看>>
Html5 离线页面缓存
查看>>
[php]在PHP中读取和写入WORD文档的代码
查看>>
WCF傻瓜模式写程序
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Java Web学习总结(13)Listener监听器
查看>>
开始Flask项目
查看>>
Ruby:多线程队列(Queue)下载博客文章到本地
查看>>
Android打包key密码丢失找回
查看>>
03 jQuery动画
查看>>
医药箱APP静态小项目
查看>>