题目链接: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. python3 发送QQ邮件

    from email.header import Headerfrom email.mime.text import MIMETextfrom smtplib import SMTP_SSL emai ...

  2. java web关于文件上传下载的总结

    文件上传使用<form method="POST"   enctype="multipart/form-data"> , 而不是默认的applica ...

  3. vue(4)hello world

    在前一章基础上开发. 1.下载vue.js.(https://cn.vuejs.org/v2/guide/installation.html) 在hello-vue根目录下创建js文件夹,并将该vue ...

  4. 单例模式+volatile禁止指令重排序

    单例模式: 单例,顾名思义就是只能有一个.不能再出现第二个.就如同地球上没有两片一模一样的树叶一样. 在这里就是说:一个类只能有一个实例,并且整个项目系统都能访问该实例. 单例模式共分为两大类: 懒汉 ...

  5. Win10磁盘占用率过高

    打开服务 禁用Superfetch 禁用Windows Search 禁用Connected User Experiences and Telemetry 禁用Windows Update[恢复选项卡 ...

  6. Mybatis学习笔记5 - 参数处理

    1.单个参数:mybatis不会做特殊处理,#{参数名}:取出参数值. 2.多个参数:mybatis会做特殊处理. 多个参数会被封装成 一个map, key:param1...paramN,或者参数的 ...

  7. SecureCRT中文乱码解决方案

    SecureCRT是一个商业终端连接工具.SecureCRT可以自定义界面颜色方案,可以连接SSH1与SSH2.Telnet等服务.默认设置下,通过SecureCRT连接SSH服务器可能出现中文乱码的 ...

  8. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  9. 自定义Qt组件-通讯模块(P3)

    1.   半双工模式实时检测串口 ComHalfDuplex类是为了解决上位机发送控制指令和下位机发送数据会在半双工RS485总线中产生冲突引起乱码而引入的(v0.010版本引入). 解决冲突的原理主 ...

  10. vue学习中遇到的onchange、push、splice、forEach方法使用

    最近在做vue的练习,发现有些js中的基础知识掌握的不牢,记录一下: 1.onchange事件:是在域的内容改变时发生,单选框与复选框改变后触发的事件. 2.push方法:向数组的末尾添加一个或多个元 ...