zoukankan      html  css  js  c++  java
  • TOJ 2778 数据结构练习题――分油问题(广搜和哈希)

    描述

    设有大小不等的三个无刻度的油桶,分别能盛满x,y,z公升油。初始时,第一个油桶盛满油,第二、三个油桶为空,在某一个油桶上分出targ公升油。

    输入

    输入包含多组测试数据。每组数据包含一行。分别x,y,z,targ四个整数,x,y,z,targ都大于 等于0,且小于32767。

    输出

    对应每组输出YES或者NO。如果可以分出targ公升油就输出YES,否则就输出NO。

    样例输入

    80 50 30 40

    样例输出

    YES

    提示

    使用队列。分油过程中,由于油桶上没有刻度,只能将油桶倒满或者倒空。三个油桶盛油的总量始终等于初始时第一个油桶盛满的油量。
    题意
    给你3个油桶,初始化第一个装满,第二个第三个为空,求能否有一个桶为targ升油,不能有丢弃
    题解
    一开始没读懂题意,傻逼了半天,题目读懂后就很easy了
    这里用广搜搜索所有情况就行了,很暴力很无脑
    这里由于X,Y,Z有点大,存状态开三维数组爆内存,这里用了map中的哈希思想
    代码
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct Node
     4 {
     5     int x,y,z;
     6     Node(int x,int y,int z):x(x),y(y),z(z){}
     7 };
     8 string To_string(int x,int y,int z)
     9 {
    10     stringstream ss;
    11     ss<<x;ss<<y;ss<<z;
    12     return ss.str();
    13 }
    14 int main()
    15 {
    16     int x,y,z,targ;
    17     while(scanf("%d%d%d%d",&x,&y,&z,&targ)!=EOF)
    18     {
    19         int flag=0;
    20         queue<Node> q;
    21         map<string,int> ma;
    22         q.push(Node(x,0,0));
    23         while(!q.empty())
    24         {
    25             Node h=q.front();q.pop();
    26             if(h.x==targ||h.y==targ||h.z==targ){flag=1;break;}//成功
    27             if(ma[To_string(h.x,h.y,h.z)])continue;//状态有过,跳过
    28             ma[To_string(h.x,h.y,h.z)]=1;//标记
    29 
    30             if(h.x+h.y<=y)q.push(Node(0,h.x+h.y,h.z));//x->y不会溢出,全倒过去
    31             else q.push(Node(h.x-y+h.y,y,h.z));//x->y会溢出,y倒满
    32 
    33             if(h.x+h.z<=z)q.push(Node(0,h.y,h.x+h.z));//x->z
    34             else q.push(Node(h.x-z+h.z,y,z));
    35 
    36             if(h.x+h.y<=x)q.push(Node(h.x+h.y,0,h.z));//y->x
    37             else q.push(Node(x,h.y-x+h.x,h.z));
    38 
    39             if(h.y+h.z<=z)q.push(Node(h.x,0,h.y+h.z));//y->z
    40             else q.push(Node(h.x,h.y-z+h.z,z));
    41 
    42             if(h.x+h.z<=x)q.push(Node(h.x+h.z,h.y,0));//z->x
    43             else q.push(Node(x,h.y,h.z-x+h.x));
    44 
    45             if(h.y+h.z<=y)q.push(Node(x,h.y+h.z,0));//z->y
    46             else q.push(Node(h.x,y,h.z-y+h.y));
    47         }
    48         printf("%s
    ",flag?"YES":"NO");
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    [LeetCode 116 117]
    看几道JQuery试题后总结(下篇)
    插入排序及其扩展
    Operation not permitted引发的惊魂72小时
    dddd
    天底下什么人都有,不要跟他们一般见识就是了
    qt宽字符串中文乱码(codec->toUnicode值得学习)
    qt事件传递过程和处理
    qt新进程工作目录的设置(工作目录确实是被子进程继承的,但也可以设置)
    面试都爱问的委托和事件(纠正)
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8687154.html
Copyright © 2011-2022 走看看