POJ 3414
http://poj.org/problem?id=3414
这是一个广搜的题目,不难,就是有些许麻烦。对于练习还是个不错的题目。
题意就是给你两个杯子,这两个杯子的容量分别为a和b,要你通过一些操作,量出c那么多的水来。
fill就是填满那个杯子。无论杯子是否油水
prou(2,1)就是从第二个杯子向第一个杯子里倒水,当第一个满了或者第二个杯子是空的为止。
drop就是把这个杯子里的水都给倒掉。
#include <cstdio>
#include <iostream>
#include <string>
#include <string.h>
#include <queue> using namespace std; #define judge(x,y) x>=0&&y>=0&&x<=a&&y<=b&&mark[x][y] //一个判断,也是减少代码量,虽然我这个代码写的还是比较渣,很多东西都要一个一个些。其实完全可以套用模板来搞。
int a,b,c,flog; struct note{
int x,y,step,pos,i; //step记录当前的步数,pos记录上一步。然后可以进行回溯吧。
char str[]; //进行储存这一步的具体操作。
}; bool mark[][]; //代表这个点是否以前出现过。 char ans[][];
queue<note>s; void bfs(int x,int y)
{
note p[],q;
while(!s.empty())
s.pop();
strcpy(p[].str,"ssss"); //我这个目的完全是为了然s不为空的,因为如果p[0]没有值的话,p[0]是进不了队列的。
p[].pos=,p[].x=,p[].y=,p[].step=,p[].i=;
s.push(p[]);
int k=;
while(!s.empty())
{
q=s.front();
s.pop();
if(q.x==c||q.y==c){ //当量出了那么多的水的时候,就输出答案。
flog=; //这个是为了确定找到了答案。
printf("%d\n",q.step); //
int m=;
strcpy(ans[m],q.str);
m++;
for(int i=q.pos;i!=;) //回溯步骤。
{
strcpy(ans[m],p[i].str);
m++;
i=p[i].pos;
}
while(m--) //倒叙输出答案。
printf("%s\n",ans[m]);
return ;
}
if(judge(a,q.y))
{
p[++k].x=a;
p[k].y=q.y;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"FILL(1)");
mark[a][q.y]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(judge(q.x,b))
{
p[++k].x=q.x;
p[k].y=b;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"FILL(2)");
mark[q.x][b]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(judge(,q.y))
{
p[++k].x=;
p[k].y=q.y;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"DROP(1)");
mark[][q.y]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(judge(q.x,))
{
p[++k].x=q.x;
p[k].y=;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"DROP(2)");
mark[q.x][]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y>=a&&judge(a,q.y+q.x-a))
{
p[++k].x=a;
p[k].y=q.y+q.x-a;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(2,1)");
mark[a][q.x+q.y-a]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y<a&&judge(q.x+q.y,))
{
p[++k].x=q.x+q.y;
p[k].y=;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(2,1)");
mark[q.x+q.y][]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y>=b&&judge(q.x+q.y-b,b))
{
p[++k].x=q.x+q.y-b;
p[k].y=b;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(1,2)");
mark[q.x+q.y-b][b]=false;
p[k].step=q.step+;
s.push(p[k]);
}
if(q.x+q.y<b&&judge(,q.x+q.y))
{
p[++k].x=;
p[k].y=q.x+q.y;
p[k].pos=q.i;
p[k].i=k;
strcpy(p[k].str,"POUR(1,2)");
mark[][q.x+q.y]=false;
p[k].step=q.step+;
s.push(p[k]);
}
}
} int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
flog=;
memset(mark,true,sizeof(mark));
bfs(,);
if(!flog) printf("impossible\n");
}
return ;
}
POJ 3414的更多相关文章
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 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 ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- BFS POJ 3414 Pots
题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...
- Pots POJ 3414
/* *POJ 3414 *简单模板bfs *编程应该为了方便理解,尽量提供接口 */ #include<cstdio> #include<algorithm> #includ ...
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- poj 3414 Pots ( bfs )
题目:http://poj.org/problem?id=3414 题意:给出了两个瓶子的容量A,B, 以及一个目标水量C, 对A.B可以有如下操作: FILL(i) fill the ...
随机推荐
- [PHP知识点乱炖]四、全局变量——小偷从良记
本章要讲的是PHP的全局变量. 这里讲个小故事: 很多年前,一个很聪明的小偷,想去偷一户人家的钱.可是他偷不到主人的钥匙,怎么办呢? 他想到了一个办法,去之前嚼了一块口香糖,口香糖的牌子是“大大泡泡糖 ...
- 【CISP笔记】安全攻击与防护
公开信息收集-搜索引擎 快速定位Google 搜索“5sf67.jsp”可以找到存在此脚本的Web网站Google 搜索“teweb/default.htm”就可找到开放着远程Web连接的服务器信息挖 ...
- ROS Hotspot服务器的搭建与设定!(上网认证)
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 说明:由于Hotspot设定的步骤比较多,此文档只讲解如何设定Hotspot的方法,关于ROS的安装与路由上网的配置请自行百度查阅. ...
- SQL获取日期格式
) + ' ' + CONVERT(VARCHAR, DATEPART(hh, GetDate())) + ':' + ) AS Date ),) ),) ),) as DateTime) as [D ...
- POJ 2151 Check the difficulty of problems
以前做过的题目了....补集+DP Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K ...
- UESTC 1851 Kings on a Chessboard
状压DP... Kings on a Chessboard Time Limit: 10000ms Memory Limit: 65535KB This problem will be judged ...
- Elven Postman(BST )
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- iOS企业级开发初级课程-UIView与控件(20集)
UIView与控件向大家介绍了视图和控件之间的关系以及应用画面的建构层次.然后是对标签.按钮.文本框.文本视图.开关.滑块.分段控件.网页控件.屏幕滚动控件.等待控件.进度条.警告.动作选单.工具栏. ...
- 在spring容器中定义初始化和销毁bean前所做的操作,有三种方式
1.使用注解,通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 package com.luoq.test.annotation.init; ...
- 在Linux上配置无线网络
导读 iwconfig是Linux Wireless Extensions(LWE)的用户层配置工具之一.LWE是Linux下对无线网络配置的工具,包括内核的支持.用户层配置工具和驱动接口的支持三部分 ...