Pots POJ - 3414【状态转移bfs+回溯】
典型的倒水问题:
即把两个水杯的每种状态视为bfs图中的点,如果两种状态可以转化,即可认为二者之间可以连一条边。
有3种倒水的方法,对应2个杯子,共有6种可能的状态转移方式。即相当于图中想走的方法有6种,依次枚举即可。
用一个二维数组标记状态,以免重复。
难点在于输出路径,即bfs回溯。
我的处理方法是,在bfs的队列基础上,用一个vector保存每一个可能的状态,即每个状态对应一个编号。同时结构体中不仅保存每个状态的信息,而且还要保存每个状态的对应编号和上一个状态的对应编号。
那么,当bfs到达终点后,就可以从后向前进行回溯,找到路径,然后反向输出即可。
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int Va,Vb,C;
struct pot
{
int a,b,step,t,my,last;
};
bool vis[][];
int a[];
queue<pot>que;
vector<pot>pre;
int bfs()
{
while(!que.empty())
que.pop();
pot s=pot{,,-,,,-};
que.push(s);
vis[][]=;
pre.push_back(s);
while(!que.empty())
{
pot now=que.front();
que.pop();
for(int i=;i<;i++)
{
pot tmp=now;
if(i==)//fill(1)
tmp.a=Va;
else if(i==)//fill(2)
tmp.b=Vb;
else if(i==)//drop(1)
tmp.a=;
else if(i==)//drop(2)
tmp.b=;
else if(i==)//pour(1,2)
{
if(tmp.a>Vb-tmp.b)
{
tmp.a-=(Vb-tmp.b);
tmp.b=Vb;
}
else
{
tmp.b+=tmp.a;
tmp.a=;
}
}
else if(i==)//pour(2,1)
{
if(tmp.b>Va-tmp.a)
{
tmp.b-=(Va-tmp.a);
tmp.a=Va;
}
else
{
tmp.a+=tmp.b;
tmp.b=;
}
}
if(!vis[tmp.a][tmp.b])
{
tmp.step=i;
tmp.t=now.t+;
tmp.last=now.my;
pre.push_back(tmp);
tmp.my=pre.size()-;
vis[tmp.a][tmp.b]=;
que.push(tmp);
if(tmp.a==C||tmp.b==C)
return tmp.t;
}
}
}
return -;
}
void print(int u)
{
if(u==)
printf("FILL(1)\n");
else if(u==)
printf("FILL(2)\n");
else if(u==)
printf("DROP(1)\n");
else if(u==)
printf("DROP(2)\n");
else if(u==)
printf("POUR(1,2)\n");
else if(u==)
printf("POUR(2,1)\n");
}
int main()
{
while(scanf("%d%d%d",&Va,&Vb,&C)!=EOF)
{
memset(vis,,sizeof(vis));
pre.clear();
int ans=bfs();
if(ans==-)
printf("impossible\n");
else
{
printf("%d\n",ans);
memset(a,,sizeof(a));
int p=pre.size()-;
int cnt=;
while(pre[p].last!=-)
{
a[++cnt]=pre[p].step;
p=pre[p].last;
}
for(int i=cnt;i>=;i--)
print(a[i]);
}
}
return ;
}
Pots POJ - 3414【状态转移bfs+回溯】的更多相关文章
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- Pots POJ 3414
/* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...
- poj 1324 状态压缩+bfs
http://poj.org/problem?id=1324 Holedox Moving Time Limit: 5000MS Memory Limit: 65536K Total Submis ...
- Pots POJ - 3414 (搜索+记录路径)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22688 Accepted: 9626 Special J ...
- kuangbin专题 专题一 简单搜索 Pots POJ - 3414
题目链接:https://vjudge.net/problem/POJ-3414 题意:给你两个杯子,分别容量为A(1),B(2)和一个C,C是需要经过下列操作,得到的一个升数.(1) FILL(i) ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- POJ 3414 Pots
Pots Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 广搜+输出路径 POJ 3414 Pots
POJ 3414 Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13547 Accepted: 5718 ...
随机推荐
- 论文《learning to link with wikipedia》
learning to link with wikipedia 一.本文目标: 如何自动识别非结构化文本中提到的主题,并将其链接到适当的Wikipedia文章中进行解释. 二.主要借鉴论文: Miha ...
- 卫星轨道相关笔记SGP4
由卫星历书确定卫星轨道状态向量 卫星历书的表示方法有2种: TLE(Two Line Element),和轨道根数表示方法 由卫星历书计算出卫星轨道状态向量的方法有2种: SGP方法,NORAD的方法 ...
- LVS服务原理以及搭建
一.LVS简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,目的在于使用集群技术和Linux操作系统实现一个高性能.高可用的服务器.它 ...
- .NET代码混淆工具NET Reactor - 初学者系列-学习者系列文章
这几天无事,除了看书,然后就倒腾原来的代码.想起.NET的代码混淆工具软件,所以今天就讲讲这个.NET代码混淆工具. .NET代码混淆工具软件,以前有了解和找过,但是当时需求不大,所以找了下就搁置了. ...
- springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- windows10家庭版的策略组
策略组是个好东西,可惜家庭版没有 但是,请看大佬博客https://blog.csdn.net/cangsheng45/article/details/82262037
- Resnet——深度残差网络(二)
基于上一篇resnet网络结构进行实战. 再来贴一下resnet的基本结构方便与代码进行对比 resnet的自定义类如下: import tensorflow as tf from tensorflo ...
- jsp的九大内置对象+四大作用域
1.request是httpServletRequest的对象,代表发送的请求信息 2.response是httpServletResponse的对象,代表响应请求返回的信息 3.session会话是 ...
- ARC 064 F-Rotated Palindromes
题意 问有多少个长度为 \(N\) 且字符集大小为 \(K\) 的字符串可以通过回文串旋转 (把第一个字符移到最后)若干次得到.\(N,K\le 10^9\) 做法 设\(f_i\)为最小周期为\(i ...
- IIS WEB站点设置
IIS安装 打开控制面板 -> 程序 -> 打开或关闭Windows功能 ,在弹出得对话框中选择“Internet信息服务”复选框.我这里是Windows server 2019 ,界面有 ...