首页 > 其他分享 >POJ 3414 Pots

POJ 3414 Pots

时间:2024-07-10 11:32:00浏览次数:7  
标签:pre 状态 int pots Pots 3414 POJ now oper

题目链接:POJ 3414 【Pots】



思路

       对于每个A、B瓶的每个状态,使用结构体存储,同时pre存储操作前的状态的下标,方便回溯查询正确路径的操作,oper存储使用什么操作得到当前状态,operNumber存储到达当前状态需要几步。由于需要求的是最少的操作次数,所以使用BFS,依次增加操作次数,逐层搜索,对于当前状态分别进行六种操作:1.将A装满,2.将B装满,3.将A倒掉,4.将B倒掉,5.将A倒入B中,6.将B倒入A中。同时对于之前出现过的状态,则continue,因为前面出现过的状态,在前面出现时的操作次数肯定比现在要小,所以剪枝,没出现过的状态直接放入队列中继续操作,直到找出满足题目要求的状态为止。


代码

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define ll long long
const int N = 1e3 + 10;

int a, b, c, counts;
bool vis[N][N];
string oper[10] = {"", "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)"};
struct pot {
  int a, b, pre, oper, operNumber, No;
  bool operator<(const pot &c) const { return operNumber > c.operNumber; }
}pots[100010];

void answer(int x) {
  int store[100010], cnt = 0;
  // 找出正确路径上的所有操作
  while (x != -1) {
    store[++cnt] = pots[x].oper;
    x = pots[x].pre;
  }
  // 由于最后一个找出来的是初始节点,初始节点对应的操作是"",所以可以不输出初始节点的操作
  for (int i = --cnt; i > 0; i--) {
    cout << oper[store[i]] << endl;
  }
}

void bfs(struct pot start) {
  priority_queue<pot> q;

  q.push(start);
  vis[start.a][start.b] = true;
  start.No = counts;
  pots[counts++] = start;


  while (!q.empty()) {
    pot pre = q.top();
    // 判断当前状态是否满足题目要求
    if (pre.a == c || pre.b == c) {
      cout << pre.operNumber << endl;
      answer(pre.No);
      return;
    }
    for (int i = 1; i <= 6; i++) {
      pot now = pre;
      // 把a倒满
      if (i == 1) {
        now.a = a;
      } else if (i == 2) {
        now.b = b;
      } else if (i == 3) {
        now.a = 0;
      } else if (i == 4) {
        now.b = 0;
      } else if (i == 5) {
        if (now.a + now.b > b) {
          now.a = now.a + now.b - b;
          now.b = b;
        } else {
          now.b = now.a + now.b;
          now.a = 0;
        }
      } else {
        if (now.a + now.b > a) {
          now.b = now.a + now.b - a;
          now.a = a;
        } else {
          now.a = now.a + now.b;
          now.b = 0;
        }
      }
      // 当当前状态每出现过时,标记当前状态,并加入队列中
      if (vis[now.a][now.b] == false) {
        now.oper = i;
        now.operNumber = pre.operNumber + 1;
        now.No = counts;
        now.pre = pre.No;
        pots[counts++] = now;
        vis[now.a][now.b] = true;
        q.push(now);
      }
    }
    // 删除当前状态
    q.pop();
  }
  // 输出找不到方法的impossible
  cout << "impossible" << endl;
}

int main() {
  cin >> a >> b >> c;

  bfs({0, 0, -1, 0, 0, 0});
  
  return 0;
}

标签:pre,状态,int,pots,Pots,3414,POJ,now,oper
From: https://www.cnblogs.com/againss/p/18293570

相关文章

  • POJ 3126 Prime Path
    题目链接:POJ3126【PrimePath】思路    由于最多有100组样例,所以直接先初始化判断出1000-9999之间的数字是否是素数。然后再对每个题目所给的四位数进行BFS搜索,依次对每个数位进行枚举,使用0-9的每一个数字对每一个数位进行替换,注意千位上的数字不能为0。然后检验当前......
  • 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
    在现代软件架构中,不同类型的类扮演着不同的角色,共同构成了一个清晰、模块化和可维护的系统。以下是对实体类(Entity)、数据传输对象(DTO)、领域对象(DomainObject)、持久化对象(PersistentObject)、业务对象(BusinessObject)、应用对象(ApplicationObject)、数据访问对象(DataAcces......
  • POJ 3278 Catch That Cow
    题目链接:POJ3278【atchThatCow】思路    将起点放入队列,然后一次取出队列中的元素,对其进行左右移动和乘2的移动,并判断移动后的位置是否合法,合法则放入队列中继续操作。每次取出队列中的元素后,通过假设剩下的步骤全部是左右移动一格来更新结果。代码#include<io......
  • POJ3017 Cut the Sequence
    POJ3017CuttheSequence题目大意给定一个一个长度为\(N\)的序列\(A\),要求把该序列划分成若干段,其中每一段中的数的和不大于\(M\),现在需要使得每一段中数的最大值的和最小,求该最小值。\[0\leqn\leq10^5\\0\leqm\leq10^{11}\\0\leqa_i\leq10^6\]解题思路......
  • 程序设计与算法(三)C++:第五章poj代码
    课程:北京大学程序设计与算法(三)   MOOCOJ:OpenJudge019:全面的MyString这个题也是有很多的成员函数,我们来从主函数分析一下:MyStrings1("abcd-"),s2,s3("efgh-"),s4(s1);//无参构造,有参构造,复制可以不写 MyStringSArray[4]={"big","me","about","take"......
  • PO/DO/VO/DTO/BO/POJO概念与区别
    一、PO/DO/VO/DTO/BO/POJO的介绍PO(PersistentObject)=DO(DataObject)持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。通过DAO层向上传输数据源对象。VO(ViewO......
  • 程序设计与算法(三)C++:第四章poj代码
    课程:北京大学程序设计与算法(三)   MOOCOJ:OpenJudge014:MyString这个题需要写的函数有点多我们来分析一下。charw1[200],w2[100]; while(cin>>w1>>w2){ MyStrings1(w1),s2=s1;//构造函数题目有了,不用写//复制构造函数没有,需要写 MyStrings3......
  • 从零手写实现 nginx-15-nginx.conf 解析处理转换为 POJO
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • 挑战程序设计竞赛 2.1章习题 poj 3046 Ant Counting
    https://vjudge.net.cn/problem/POJ-3046#author=GPT_zh有一天,贝西在蚂蚁山里探头探脑,看着蚂蚁们来来回回地觅食。她发现很多蚂蚁都是兄弟姐妹,彼此无法区分。她还发现,有时只有一只蚂蚁去觅食,有时几只,有时全部。这就产生了大量不同组合的蚂蚁!有点数学天赋的贝茜开始琢磨起来......
  • 挑战程序设计竞赛 2.2章习题 POJ - 3617 Best Cow Line 贪心
    FJ正准备带着他的N头奶牛(1≤N≤2,000)参加一年一度的“年度最佳农民”比赛。在这个比赛中,每个农民都会将他的奶牛排成一行,然后引导它们经过评委。今年比赛的组织者采用了一种新的注册方案:只需按照它们出现的顺序注册每头奶牛的首字母(即如果FJ带着Bessie、Sylvia和Dora依次出......