题目链接:http://poj.org/problem?id=3414

解题报告:

1、每个节点都是一个独立的状态

2、这里的状态转移就是有几种出路,4种:1、倒掉a中的水,2、把a中的水倒到b中去,3、倒掉b 中的水,4、把b中的水倒到a中去

3、每次的步骤记录到str[][]中去

4、搜索最短路径

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std; struct Node
{
int a; ///a杯子里面的水
int b; ///b杯子里面的水
int step; ///到a,b的情况下所用的步数
char str[][]; ///str[i]存有解时,step=i时的操作
}; int A,B,C; ///A,B表示两个杯子的容量,C目标容量
bool mark[][]; ///mark[i][j]表示在两个杯子在i,j的情况是否标记 bool bfs()
{
memset(mark,false,sizeof(mark)); queue<Node>que;
Node p,tmp; p.a=,p.b=,p.step=;
que.push(p);
mark[][]=true; while(!que.empty())
{
p=que.front();
que.pop(); ///搜索到解
if(p.a==C||p.b==C)
{
printf("%d\n",p.step);
for(int i=; i<=p.step; i++)
printf("%s\n",p.str[i]);
return true;
} if(p.a==)
{
tmp=p;
tmp.a=A;///倒满
tmp.step++;
strcpy(tmp.str[tmp.step],"FILL(1)");
if(!mark[tmp.a][tmp.b])
{
mark[tmp.a][tmp.b]=true;
que.push(tmp);
}
}
else if(p.a<=A) ///可以选择倒掉,也可以选择倒到2杯子中去
{
tmp=p;
tmp.a=;///倒掉
tmp.step++;
strcpy(tmp.str[tmp.step],"DROP(1)");
if(!mark[tmp.a][tmp.b])
{
mark[tmp.a][tmp.b]=true;
que.push(tmp);
}
if(p.b<B)
{
tmp=p;
if(tmp.a+tmp.b<=B)
{
tmp.b+=tmp.a;
tmp.a=;
}
else
{
tmp.a=(tmp.b+tmp.a)-B;
tmp.b=B;
}
tmp.step++;
strcpy(tmp.str[tmp.step],"POUR(1,2)");
if(!mark[tmp.a][tmp.b])
{
mark[tmp.a][tmp.b]=true;
que.push(tmp);
}
}
} if(p.b==)
{
tmp=p;
tmp.b=B;///倒满
tmp.step++;
strcpy(tmp.str[tmp.step],"FILL(2)");
if(!mark[tmp.a][tmp.b])
{
mark[tmp.a][tmp.b]=true;
que.push(tmp);
}
}
else if(p.b<=B) ///可以选择倒掉,也可以选择倒到1中
{
tmp=p;
tmp.b=; ///倒掉
tmp.step++;
strcpy(tmp.str[tmp.step],"DROP(2)");
if(!mark[tmp.a][tmp.b])
{
mark[tmp.a][tmp.b]=true;
que.push(tmp);
}
if(p.a<A) ///倒到1中
{
tmp=p;
if(tmp.b+tmp.a<=A)
{
tmp.a+=tmp.b;
tmp.b=;
}
else
{
tmp.b=(tmp.b+tmp.a)-A;
tmp.a=A;
}
tmp.step++;
strcpy(tmp.str[tmp.step],"POUR(2,1)");
if(!mark[tmp.a][tmp.b])
{
mark[tmp.a][tmp.b]=true;
que.push(tmp);
}
}
}
} return false;
} int main()
{
while(scanf("%d%d%d",&A,&B,&C)!=EOF)
{
if(!bfs()) puts("impossible");
}
return ;
}

广搜最短路径变形,(POJ3414)的更多相关文章

  1. poj3984迷宫问题 广搜+最短路径+模拟队列

    转自:http://blog.csdn.net/no_retreats/article/details/8146585   定义一个二维数组: int maze[5][5] = { 0, 1, 0, ...

  2. 广搜,深搜,单源最短路径,POJ(1130),ZOJ(1085)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=85 http://poj.org/problem?id=1130 这 ...

  3. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  4. hdu 1242:Rescue(BFS广搜 + 优先队列)

    Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. poj 3026 Borg Maze 最小生成树 + 广搜

    点击打开链接 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7097   Accepted: 2389 ...

  6. nyoj 523 双向广搜

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstd ...

  7. 解救小哈——bfs广搜

    问题描述: 小哈去玩迷宫,结果迷路了,小哼去救小哈.迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物. 问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径 ...

  8. hdu 1253 胜利大逃亡 (广搜)

    题目链接 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成A个 ...

  9. 69.广搜练习:  最少转弯问题(TURN)

    [问题描述] 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯 ...

随机推荐

  1. sql server 字符串转table

    -- ============================================= -- Author: gengc -- Create date: <2012-12-29> ...

  2. RequestContextHolder与RequestContextUtils

    org.springframework.web.servlet.support.RequestContextUtils 在spring-webmvc中, 主要用来获取WebApplicationCon ...

  3. Windows Server2008服务器可以远程桌面,但在内网中却Ping不通--解决方法

    Windows Server2008服务器可以通过远程桌面登录,但在内网中却Ping不通.所以要考虑的是防火墙是不是做了限制. 最简单粗暴的方法是直接把防火墙给关掉 还有个其他的方法是参考别人写的,我 ...

  4. getter与setter

    var obj = { get a() { return 2; }, get c() { return 34 } } Object.defineProperty( obj, 'b', { get: f ...

  5. 18-----BBS论坛

    BBS论坛(十八) 18.首页轮播图实现 (1)front/css/front_base.css .main-container{ width: 990px; margin: 0 auto; over ...

  6. getResourceAsStream小结

    前提:我用的是gradle工程,文件放在resource下,resource对应的就是类路径,文件的路径和代码的路径保持一致,如Client的包名和peizhi.properties一致,例如Clie ...

  7. 怎么查找Linux系统调用

    目前都是这么找: git grep SYSCALL_DEFINE | grep signal系统调用的函数名本来是叫sys_xxx,现在都是用宏SYSCALL_DEFINE(XXX),搞得无法找到sy ...

  8. JEECMS站群管理系统-- 首页的加载过程

    在浏览器中输入http://localhost:8080/jeecms,回车 首先进入配置文件web.xml, <context-param> <param-name>cont ...

  9. c++隐式类型转换和explicit

    什么是隐式转换? 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了哪些 ...

  10. php中配置伪静态

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法 1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查 ...