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), ...
随机推荐
- 织梦dedecms 模板文件不存在,无法解析文档!
方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives.class.php 556行 if (!preg_match("# ...
- 动态改变swiper的属性
<script> var mySwiper = new Swiper('.swiper-container',{ autoplay : 1000, autoplayDisableOnInt ...
- jdk1.8.0_45源码解读——ArrayList的实现
jdk1.8.0_45源码解读——ArrayList的实现 一.ArrayList概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素. ...
- [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题
花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ...
- vue-awesome-swiper
本文地址:https://www.cnblogs.com/veinyin/p/9370113.html 聊起轮播就会想到 swiper,作为一个强大的轮播插件,当然有人为 Vue 进行二次封装,那就 ...
- c++刷题(15/100)矩阵转置,最深子树
题目一:矩阵转置 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出 ...
- 【leetcode 简单】 第五十八题 计数质数
统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . class Solution: def cou ...
- cin.get()和cin.getline()之间的区别
cin.getline()和cin.get()都是对输入的面向行的读取,即一次读取整行而不是单个数字或字符,但是二者有一定的区别. cin.get()每次读取一整行并把由Enter键生成的换行符留在输 ...
- 如何在ie6/ie7/ie8中实现iframe背景透明
最近做了一个项目,涉及到ie8iframe背景透明的问题,做了老半天,才把它搞定的,现在把我的经历贴出来和大家分享: 众所周知的根据W3C CSS 2.1 规范规定,''''background-co ...
- 【codeforces】【比赛题解】#948 CF Round #470 (Div.2)
[A]Protect Sheep 题意: 一个\(R*C\)的牧场中有一些羊和一些狼,如果狼在羊旁边就会把羊吃掉. 可以在空地上放狗,狼不能通过有狗的地方,狼的行走是四联通的. 问是否能够保护所有的羊 ...