zoukankan      html  css  js  c++  java
  • 非常可乐 HDU

    题目链接:https://cn.vjudge.net/problem/HDU-1495

    题意:有一瓶S升的可乐,给容量分别为A,B的两个杯子倒可乐,它们三个之间可以互相倒可乐。问这个三个容器之间的两个容器能不能平分S升的可乐。

    思路:如果S是奇数的话,一定不能平分的.然后有六种倒法嘛,S-A,A-S,S-B,B-S,A-B,B-A。因为不清楚刻度,所以只有两种情况,1.一个容器里的可乐全倒进另一个容器 2.一个容器将另一个容器倒满并且还剩可乐。将三个容器出现过的情况用一个三维数组进行标记。

    注意:一开始标记的是vis[s][0][0]

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <queue>
      5 #include <stack>
      6 #include <algorithm>
      7 #include <cmath>
      8 #include <map>
      9 #define mem(a,b) memset(a,b,sizeof(a));
     10 using namespace std;
     11 #define INF 0x3f3f3f3f
     12 typedef long long ll;
     13 int dir[4][2] = {0,1,0,-1,1,0,-1,0};
     14 const int maxn = 5000005;
     15 int s,n,m,vis[105][105][105],ans;
     16 bool flag;
     17 struct node {
     18     int x,y,z,w;
     19     node(int x1,int y1,int z1,int w1):x(x1),y(y1),z(z1),w(w1){};
     20 };
     21 void BFS(int x1,int y1,int z1) {
     22     queue<node>q;
     23     q.push(node(x1,y1,z1,0));
     24     vis[x1][y1][z1] = 1;
     25     int av = x1 / 2;
     26     while(!q.empty()) {
     27         node temp= q.front();
     28         q.pop();
     29         if(temp.x == av&&temp.y == av) {
     30             flag = 1;
     31             ans  = temp.w;
     32             break;
     33         }
     34         else if(temp.x == av&&temp.z == av) {
     35             flag = 1;
     36             ans  = temp.w;
     37             break;
     38         }
     39         else if(temp.z == av&&temp.y == av) {
     40             flag = 1;
     41             ans  = temp.w;
     42             break;
     43         }
     44         int fx,fy,fz;
     45         //s-a
     46             if(temp.x > (n - temp.y)) {
     47                 fy = n;
     48                 fx = temp.x+temp.y-n;
     49                 fz = temp.z;
     50             }
     51             else {
     52                 fy = temp.x + temp.y;
     53                 fx = 0;
     54                 fz = temp.z;
     55             }
     56             if(!vis[fx][fy][fz]) {
     57                 vis[fx][fy][fz] = 1;
     58                 q.push(node(fx,fy,fz,temp.w+1));
     59             }
     60         //a-s
     61             fy = 0;
     62             fz = temp.z;
     63             fx = temp.x + temp.y;
     64             if(!vis[fx][fy][fz]) {
     65                 vis[fx][fy][fz] = 1;
     66                 q.push(node(fx,fy,fz,temp.w+1));
     67             }
     68         //s-b
     69             if(temp.x > (m - temp.z)) {
     70                 fy = temp.y;
     71                 fx = temp.x+temp.z-m;
     72                 fz = m;
     73             }
     74             else {
     75                 fy = temp.y;
     76                 fx = 0;
     77                 fz = temp.z + temp.x;
     78             }
     79             if(!vis[fx][fy][fz]) {
     80                 vis[fx][fy][fz] = 1;
     81                 q.push(node(fx,fy,fz,temp.w+1));
     82             }
     83          //b-s
     84             fx = temp.x + temp.z;
     85             fy = temp.y;
     86             fz = 0;
     87             if(!vis[fx][fy][fz]) {
     88                 vis[fx][fy][fz] = 1;
     89                 q.push(node(fx,fy,fz,temp.w+1));
     90             }
     91          //a-b
     92             if(temp.y > (m- temp.z)) {
     93                 fz = m;
     94                 fy = temp.y + temp.z - m;
     95                 fx = temp.x;
     96              }
     97              else {
     98                 fy = 0;
     99                 fz = temp.y + temp.z;
    100                 fx = temp.x;
    101              }
    102              if(!vis[fx][fy][fz]) {
    103                 vis[fx][fy][fz] = 1;
    104                 q.push(node(fx,fy,fz,temp.w+1));
    105             }
    106          //b-a
    107             if(temp.z > (n - temp.y)) {
    108                 fy = n;
    109                 fx = temp.x;
    110                 fz = temp.z + temp.y - n;
    111             }
    112             else {
    113                 fz = 0;
    114                 fy = temp.z + temp.y;
    115                 fx = temp.x;
    116             }
    117             if(!vis[fx][fy][fz]) {
    118                 vis[fx][fy][fz] = 1;
    119                 q.push(node(fx,fy,fz,temp.w+1));
    120             }
    121 
    122     }
    123 }
    124 int main()
    125 {
    126     while(cin >> s >> n >> m && s && m && n) {
    127          mem(vis,0);
    128          flag = 0;
    129          if(s % 2 == 1) {
    130             cout << "NO" << endl;
    131             continue;
    132          }
    133          BFS(s,0,0);
    134          if(flag) {
    135             cout << ans << endl;
    136          }
    137          else {
    138             cout << "NO" << endl;
    139          }
    140     }
    141     return 0;
    142 }
  • 相关阅读:
    Android下获取FPS的几种方法
    Headless Android开发板的调试及远程显示和控制
    ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理
    Android远程桌面助手(Build 0787)
    Android远程桌面助手(Build 0737)
    Vysor破解助手for Linux/macOS/Windows
    Android远程桌面助手
    Vysor破解助手for Linux and macOS
    Django入门第一步(安装和创建一个简单的项目)
    Python-操作Excel
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/11380988.html
Copyright © 2011-2022 走看看