CSU - 2061 Z‘s Coffee
Description
Z is crazy about coffee. One day he bought three cups of coffee. The first cup has a capacity of A ml, the second has B ml and the third has C ml. At the beginning, only the first cup is full of coffee, that is, Z only has A ml coffee and the other cups is empty. Because the cup has no scale, one operation of pouring coffee only stop until either one cup is full or empty. Z can only choose two cups to do the pouring operation. For some reasons, Z wants to get exactly D ml of coffee, and also he is so lazy that want the number of operations as least as possible. So he ask you for help.
Input
The first line is the case number T.
Each case has one line with four integers A B C D as mentioned above.
1 ≤ A, B, C ≤ 1000
1 ≤ D ≤ max(A, B, C)
1 ≤ T ≤ 100
Output
If he can get the exactly milliliter of coffee as he want, then print the least number of operation in a line.
And print the initial capacity of the three cups and then print the result after each operation line by line.
The print order should be the first cup, the second cup and the third cup.
If there are more than one operation schema, any of them will be accepted.
If he cannot get the exactly milliliter of coffee as he want , print "-1" without quotation.
Sample Input
1
12 8 5 10
Sample Output
5
12 0 0
7 0 5
0 7 5
5 7 0
5 2 5
10 2 0
Hint
Source
Author
周杰辉
#include<stdio.h>
#include<queue>
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 1e6 + 5;
struct node{
int cup[3],stp;
int hash(){ return cup[0] * 1001 * 1001 + cup[1] * 1001 + cup[2]; }
void print(){ printf("%d %d %d\n", cup[0], cup[1], cup[2]); }
};
queue<node>q;
set<int>se;
vector<node>ve;
node Q[MAXN];
int pre[MAXN];
int cup[3], d;
int bfs()
{
int l = 0,r=0;
node tmp;
tmp.cup[0] = cup[0]; tmp.cup[1] = tmp.cup[2]=tmp.stp = 0;
Q[++r] = tmp;
se.insert(tmp.hash());
while (l<r)
{
node u = Q[++l];
for (int i = 0; i < 3;i++)
if (u.cup[i])//对每个杯子
{
for (int j = 0; j < 3;j++)
if (i != j&&u.cup[j] != cup[j])//不同杯子 也没有满
{
node v = u;
if (v.cup[i] + v.cup[j]>cup[j])
{
v.cup[i] = v.cup[i] - (cup[j] - v.cup[j]);
v.cup[j] = cup[j];
}
else
{
v.cup[j] += v.cup[i];
v.cup[i] = 0;
}
v.stp = u.stp + 1;
int hash = v.hash();
if (!se.count(hash))//记录是否出现过该情况
{
se.insert(hash);
Q[++r] = v;
pre[r] = l;
for (int k = 0; k < 3; k++)
{
if (v.cup[k] == d)return r;
}
}
}
}
}
return -1;
}
int main()
{
int T;
while (~scanf("%d", &T))
{
while (T--)
{
while (!q.empty())
q. pop();
scanf("%d %d %d %d", &cup[0], &cup[1], &cup[2],&d);
se.clear();
int ans = bfs();
if (ans == -1)
{
printf("-1\n");
continue;
}
int cnt = Q[ans].stp;
ve.clear();
for (int i = ans; i; i = pre[i])
ve.push_back(Q[i]);
reverse(ve.begin(), ve.end());
printf("%d\n", cnt);
for (int i = 0; i < ve.size(); i++)
{
printf("%d %d %d\n", ve[i].cup[0], ve[i].cup[1], ve[i].cup[2]);
}
}
} return 0;
}
CSU - 2061 Z‘s Coffee的更多相关文章
- CSU - 2062 Z‘s Array
Description Z likes to play with array. One day his teacher gave him an array of n elements, and ask ...
- 【Python】使用torrentParser1.03对多文件torrent的分析结果
Your environment has been set up for using Node.js 8.5.0 (x64) and npm. C:\Users\horn1>cd C:\User ...
- CSU - 2059 Water Problem(Z线分割平面)
一条‘Z’形线可以将平面分为两个区域,那么由N条Z形线所定义的区域的最大个数是多少呢?每条Z形线由两条平行的无限半直线和一条直线段组成 Input 首先输入一个数字T(T<100),代表有T次询 ...
- CSU 1116 Kingdoms(枚举最小生成树)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只 ...
- CSU 1113 Updating a Dictionary(map容器应用)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...
- CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...
- 字符串 - 近似回文词 --- csu 1328
近似回文词 Problem's Link:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 analyse: 直接暴力枚举每一个终点,然后枚举 ...
- CSU 1507 超大型LED显示屏 第十届湖南省赛题
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1507 解题思路:这是一道模拟题,看了那么多人的代码,我觉得我的代码是最简的,哈哈,其实就 ...
- 【最短路】【数学】CSU 1806 Toll (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1806 题目大意: N个点M条有向边,给一个时间T(2≤n≤10,1≤m≤n(n-1), ...
随机推荐
- php设计模式之工厂设计模式
概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 好处: PHP中能够创建基于变量内容 ...
- 配置SpringBoot-从日志系统配置说起
大小系统都需要打日志. 系统在不同环境下对日志的配置要求是不一样的 比如 开发本地: 直接输出到控制台 生产环境: 输出到文件或者额外的日志收集系统, 比如 graylog. (本文不探讨具体日志系统 ...
- Linux dig命令
dig(Domain Information Groper),和nslookup作用有些类似,都是DNS查询工具 1.dig命令格式 dig @dnsserver name querytype 如果你 ...
- PHP内存溢出 Allowed memory size of 解决办法
PHP出现如下错误:Allowed memory size of xxx bytes exhausted at xxx:xxx (tried to allocate xxx bytes) 关于 ...
- 配置replica set的常见问题
总有人问起配置ReplicaSet不成功,总结了一下基本上的可能性就几种,检查步骤如下: 假设三台机器的IP分别是 A: 192.168.1.2 a.test.com B:192.168.1.3 b. ...
- Shell-输入密码转换为*
Code: read -p "请输入使用者都名称:" USER echo -e "请输入使用者密码: \c" while : ;do char=` #这里是反引 ...
- kernel 3.10内核源码分析--TLB相关--TLB概念、flush、TLB lazy模式 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4808877&uid=14528823 一.概念及基本原理 TLB ...
- Deploy Openstack all-in-one Shell Script
Deploy Openstack all-in-one Shell Script At present(2015/10), the RDO deploment method can only inst ...
- 19 Error handling and Go go语言错误处理
Error handling and Go go语言错误处理 12 July 2011 Introduction If you have written any Go code you have pr ...
- js 去除字符串所有空格
function trim(str){ return str.replace(/\s|\xA0/g,""); }