题目链接: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 – Configuration Manager – Cannot Connect to WMI Provider. You Do Not Have Permission or The Server is Unreachable

    打开SQL SERVER Configuarion Manger 出现以下错误 SQL Server Configuration Manager—————————Cannot connect to W ...

  2. leetcode 892. 三维形体的表面积

    题目描述: 在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上. 返回最终形体的表面积. ...

  3. JS 中Math.ceil()、Math.floor()和Math.round()的区别

    var arg1 = 12.2; var arg2 = 12.5; var arg3 = 12.7; ceil():将小数部分一律向整数部分进位 var c1 = Math.ceil(arg1); v ...

  4. (转)Linux curl命令详解

    命令:curl在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. ...

  5. MongoDB数据库常用操作

    推荐文章 --- 一天精通MongoDB数据库 注意: monogdb数据在使用之后必须及时 mongodb.close()否则后台崩溃. 1. 删除文档中的一个字段 db.<集合名>.u ...

  6. MATLAB矩阵操作和算术运算符

    矩阵的表示 矩阵之间用空格或者是逗号间隔 矩阵可以拼接(可以用矩阵拼接) 实部矩阵和虚部矩阵构成复数矩阵,一一对应. 冒号表达式: 格式: e1:e2:e3 e1表示初始值    e2表示步长   e ...

  7. ubuntu使用ppa源安装最新版本的git

    国内也有ubuntu镜像源.但是里面的git都是1.9版本.最新的已经是2.3了 1 首先使用将ppa源加入Ubuntu,交大家 sudo add-apt-repository ppa:pdoes/p ...

  8. js的事件冒泡

    先来段代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  9. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)

    上期我们完成了一个简单的主从页面,但是页面是静态的,不能交互,功能也很简单,只有一个销售订单的列表. 我们今天就一鼓作气把代码全都写完,由于本次的代码量较大,所以只对重点代码部分进行讲解. 具体每个文 ...

  10. 微信小程序可用的第三方库

    1.wxDraw 轻量的小程序canvas动画库,专门用于处理小程序上canvas 的图形创建.图形动画,以及交互问题. 链接:http://project.ueflat.xyz/#/ 2.ZanUi ...