nyoj三个水杯(bfs)
三个水杯
- 描述
- 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
- 输入
- 第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态 - 输出
- 每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
- 样例输入
-
2
6 3 1
4 1 1
9 3 2
7 1 1 - 样例输出
-
3
-1题解:bfs里用两个循环代表从j往i杯子里倒水;
- 代码:
-
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct Node{
int wat[];
int step;
};
int cup[];
int res[];
int vis[][];
void bfs(int sx,int sy,int sz){
memset(vis,,sizeof(vis));
queue<Node>dl;
Node a,b;
a.wat[]=sx;a.wat[]=sy;a.wat[]=sz;
vis[sx][sy]=;
a.step=;
dl.push(a);
while(!dl.empty()){
a=dl.front();
dl.pop();
if(a.wat[]==res[]&&a.wat[]==res[]&&a.wat[]==res[]){
printf("%d\n",a.step);
return;
}
for(int i=;i<;i++)
for(int j=;j<;j++){
b=a;
b.step++;
if(i!=j){
//printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]);
if(a.wat[j]+a.wat[i]<=cup[i]){
b.wat[i]=a.wat[i]+a.wat[j];
b.wat[j]=;
}
else{
b.wat[i]=cup[i];
b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]);
}
if(b.wat[]==res[]&&b.wat[]==res[]&&b.wat[]==res[]){
printf("%d\n",b.step);
return;
}
//printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);
if(!vis[b.wat[]][b.wat[]])dl.push(b);
vis[b.wat[]][b.wat[]]=;
}
}
}
puts("-1");
}
int main(){
int N;
scanf("%d",&N);
while(N--){
for(int i=;i<;i++)scanf("%d",cup+i);
for(int i=;i<;i++)scanf("%d",res+i);
bfs(cup[],,);
}
return ;
}bfs优化:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct Node{
int wat[];
int step;
friend bool operator < (Node a,Node b){
return a.step>b.step;
}
};
int cup[];
int res[];
int vis[][];
void bfs(int sx,int sy,int sz){
memset(vis,,sizeof(vis));
priority_queue<Node>dl;
Node a,b;
a.wat[]=sx;a.wat[]=sy;a.wat[]=sz;
vis[sx][sy]=;
a.step=;
dl.push(a);
while(!dl.empty()){
a=dl.top();
dl.pop();
if(a.wat[]==res[]&&a.wat[]==res[]&&a.wat[]==res[]){
printf("%d\n",a.step);
return;
}
for(int i=;i<;i++)
for(int j=;j<;j++){
b=a;
b.step++;
if(i!=j){
//printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]);
if(a.wat[j]+a.wat[i]<=cup[i]){
b.wat[i]=a.wat[i]+a.wat[j];
b.wat[j]=;
}
else{
b.wat[i]=cup[i];
b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]);
}
if(b.wat[]==res[]&&b.wat[]==res[]&&b.wat[]==res[]){
printf("%d\n",b.step);
return;
}
//printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);
if(!vis[b.wat[]][b.wat[]])dl.push(b);
vis[b.wat[]][b.wat[]]=;
}
}
}
puts("-1");
}
int main(){
int N;
scanf("%d",&N);
while(N--){
for(int i=;i<;i++)scanf("%d",cup+i);
for(int i=;i<;i++)scanf("%d",res+i);
bfs(cup[],,);
}
return ;
}
nyoj三个水杯(bfs)的更多相关文章
- 三个水杯 (bfs)
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...
- nyoj 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...
- nyoj 21-三个水杯(BFS)
21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...
- nyoj 21三个水杯(BFS + 栈)
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...
- NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS
题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...
- NYOJ #21 三个水杯(bfs)
描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...
- NYOJ 21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- nyoj 题目21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
随机推荐
- QQ在线咨询状态显示不出来怎么办?http://bizapp.qq.com/webpres.htm
- codeforces 15D . Map 优先队列
题目链接 题目意思很简单nm的矩阵里, 选若干个ab的小矩阵, 定义每个矩阵的值为这个矩阵里的所有数的和-最小值*数的个数. 选小矩阵时, 优先选值最小的,然后次小的.. 知道不能选位置. 输出所有矩 ...
- 高精度 java的一些题
poj 1001 Exponentiation import java.util.*; import java.math.*; public class Main { public static vo ...
- ORACLE 两个表或两个结果集的数据对比常用的函数
假设有两个表A,B,都只有一个字段PHONE 1,MINUS SELECT PHONE FROM A MINUS SELECT PHONE FROM B; 相当于用结果集A减去结果B得出的结果 ...
- flash跨域策略文件crossdomain.xml
flash在跨域时唯一的限制策略就是crossdomain.xml文件,该文件限制了flash是否可以跨域读写数据以及允许从什么地方跨域读写数据. 位于www.a.com域中的SWF文件要访问www. ...
- [LeetCode][Python]17: Letter Combinations of a Phone Number
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 17: Letter Combinations of a Phone Numb ...
- openstack 采用conductor的原因
供参考. Tan0同学给我的解释: 两个原因 一个是为了isolation做准备 因为升级主要就是升DB的schema 如果让compute直接读写DB,那每次升级都得升compute 现在隔离开之后 ...
- linux去掉svn里记住的用户名密码
去掉svn里记住的用户名密码 删除掉 c:\Documents and Settings\administrator\ApplicationData\Subversion\auth\svn.sim ...
- 面向对象程序设计-C++_课时18内联函数
使用inline说明的函数称内联函数. 在C++中,除具有循环语句.switch语句的函数不能说明为内联函数外,其他函数都可以说明为内联函数. #include <iostream> us ...
- CAD二次开发(.NET)之PaletteSet和Palette
在CAD中经常用到停靠或浮动的PaletteSet,比如:特性.图层特性管理器.工具选项板等(以下截图来自AutoCAD2010界面). 特性PaletteSet(停靠) 图层特性管理器Palette ...