zoukankan      html  css  js  c++  java
  • uva 571(bfs)

    题意:就是倒水游戏,有两个杯子无限水可以进行三种操作:

    一个杯子装满水,一个杯子倒光,一个杯子倒到另一个杯子。

    最后要求其中一个杯子的水量到n,然后输出步骤。

    思路:bfs即可,最后递归输出。

    代码如下:

      1 /**************************************************
      2  * Author     : xiaohao Z
      3  * Blog     : http://www.cnblogs.com/shu-xiaohao/
      4  * Last modified : 2014-03-28 18:49
      5  * Filename     : uva_571.cpp
      6  * Description     : 
      7  * ************************************************/
      8 
      9 #include <iostream>
     10 #include <cstdio>
     11 #include <cstring>
     12 #include <cstdlib>
     13 #include <cmath>
     14 #include <algorithm>
     15 #include <queue>
     16 #include <stack>
     17 #include <vector>
     18 #include <set>
     19 #include <map>
     20 #define MP(a, b) make_pair(a, b)
     21 #define PB(a) push_back(a)
     22 
     23 using namespace std;
     24 typedef long long ll;
     25 typedef pair<int, int> pii;
     26 typedef pair<unsigned int,unsigned int> puu;
     27 typedef pair<int, double> pid;
     28 typedef pair<ll, int> pli;
     29 typedef pair<int, ll> pil;
     30 
     31 const int INF = 0x3f3f3f3f;
     32 const double eps = 1E-6;
     33 const int LEN = 1010;
     34 int ca, cb, n;
     35 pii vis[LEN][LEN];
     36 
     37 pii empty(pii x, int a){
     38     if(a == 0)return MP(0, x.second);
     39     else return MP(x.first, 0);
     40 }
     41 
     42 pii fill(pii x, int a){
     43     if(a == 1) return MP(x.first, cb);
     44     else return MP(ca, x.second);
     45 }
     46 
     47 pii pour(pii x, int a, int b){
     48     int tmp = x.first + x.second;
     49     if(a == 0 && b == 1){
     50          if(tmp <= cb) return MP(0, tmp);
     51          else return MP(tmp - cb, cb);
     52     }else{
     53         if(tmp <= ca) return MP(tmp, 0);
     54         else return MP(ca, tmp - ca);
     55     }
     56 } 
     57 
     58 void flush(pii nvex, pii nv, queue<pii> &q){
     59     if(vis[nv.first][nv.second].first == -1){
     60         vis[nv.first][nv.second] = nvex;
     61         q.push(nv);
     62     }
     63 }
     64 
     65 pii bfs(){
     66     memset(vis, -1, sizeof vis);
     67     queue<pii> q;
     68     q.push(MP(0, 0));
     69     vis[0][0] = MP(0, 0);
     70     while(!q.empty()){
     71         pii nvex = q.front(), nv; q.pop();
     72         if(nvex.first == n || nvex.second == n) return nvex;
     73         nv = empty(nvex, 0);flush(nvex, nv, q);
     74         nv = empty(nvex, 1);flush(nvex, nv, q);
     75         nv = fill(nvex, 0);flush(nvex, nv, q);
     76         nv = fill(nvex, 1);flush(nvex, nv, q);
     77         nv = pour(nvex, 0, 1);flush(nvex, nv, q);
     78         nv = pour(nvex, 1, 0);flush(nvex, nv, q);
     79     }
     80     return MP(-1, -1);
     81 }
     82 
     83 void out(int x, int y){
     84     pii nv, nvex = vis[x][y];
     85     if(vis[x][y] == MP(x, y)) return ;
     86     int op;
     87     nv = empty(nvex, 0); if(nv == MP(x, y)) op = 1;
     88     nv = empty(nvex, 1); if(nv == MP(x, y)) op = 2;
     89     nv = fill(nvex, 0); if(nv == MP(x, y)) op = 3;
     90     nv = fill(nvex, 1); if(nv == MP(x, y)) op = 4;
     91     nv = pour(nvex, 0, 1); if(nv == MP(x, y)) op = 5;
     92     nv = pour(nvex, 1, 0); if(nv == MP(x, y)) op = 6;
     93     out(vis[x][y].first, vis[x][y].second);
     94     switch(op){
     95         case 1: cout << "empty A" << endl;break;
     96         case 2: cout << "empty B" << endl;break;
     97         case 3: cout << "fill A" << endl;break;
     98         case 4: cout << "fill B" << endl;break;
     99         case 5: cout << "pour A B" << endl; break;
    100         case 6: cout << "pour B A" << endl; break;
    101     }
    102 }
    103 
    104 int main()
    105 {
    106     //freopen("in.txt", "r", stdin);
    107 
    108     ios::sync_with_stdio(false);
    109     while(cin >> ca >> cb >> n){
    110         pii pos = bfs();
    111         out(pos.first, pos.second);
    112         cout << "success" << endl;
    113     }
    114     return 0;
    115 }
    View Code
  • 相关阅读:
    分页插件PageHelper
    持久层的具体实现
    SSM框架搭建
    mysql库中建立存储过程
    安装python2.7
    Spark应用程序第三方jar文件依赖解决方案
    spark2.0.1源码编译
    Hadoop2.7.3源码编译
    Hadoop2.x伪分布式环境搭建(一)
    Linux基础环境的各项配置(三)
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3631566.html
Copyright © 2011-2022 走看看