都做过倒水的问题,有一个3升和5升的水桶和无限的水,现在要求桶中恰好装入4升水。POJ3414就是这类的倒水问题,给你两个桶,容量为A,B。现在要求称出C升水。(1<=A,B<=100,C<=MAX(A,B))
并且要使操作次数最少,打印最少次数和操作。
操作次数最少,显然是广度优先搜索可以快速达到要求。对于两个桶的状态,它一共有六种操作:把A倒满,把B倒满,把A清空,把B清空,把A中的水倒入B,把B中的水倒入A。这样搜索就是搜索一棵6叉树,注意保存路径(每个状态都有一个父状态)。
#include <iostream>
using namespace std;
const int MAX = 100000;
short A,B,C;
int length;
bool flag[101][101];
typedef struct
{
short a;
short b;
short op; //op = 1,倒满s;op=2,清空s;op=3,把s到入e
short s;
short e;
int parent;
}Condition;
Condition queue[MAX];
int k = -1;
void print(int p)
{
if(p != -1)
{
k++;
print(queue[p].parent);
}
if(p == -1)
{
printf("%d\n",k);
return;
}
if(queue[p].op == 1)
printf("FILL(%d)\n", queue[p].s);
if(queue[p].op == 2)
printf("DROP(%d)\n", queue[p].s);
if(queue[p].op == 3)
printf("POUR(%d,%d)\n", queue[p].s, queue[p].e);
}
int main()
{
int i,j;
short a,b;
bool tag = false;
Condition now;
memset(flag,0,sizeof(flag));
cin>>A>>B>>C;
Condition initial;
initial.a = 0;
initial.b = 0;
initial.op = -1;
initial.parent = -1;
flag[0][0] = true;
queue[0] = initial;
int head = 0,tail = 1;
while(head != tail)
{
now = queue[head++];
a = now.a; b = now.b;
if(now.a == C || now.b == C)
{
tag = true;
break;
}
//6种操作:把1填满,把2填满,把1倒空,把2倒空,把1的水倒入2,把2的水到入1
Condition adj1;
adj1.a = A;
adj1.b = b;
if(!flag[A][b])
{
adj1.parent = head - 1;
adj1.op = 1;
adj1.s = 1;
queue[tail++] = adj1;
flag[A][b] = true;
}
adj1.a = a;
adj1.b = B;
if(!flag[a][B])
{
adj1.parent = head - 1;
adj1.op = 1;
adj1.s = 2;
queue[tail++] = adj1;
flag[a][B] = true;
}
adj1.a = 0;
adj1.b = b;
if(!flag[0][b])
{
adj1.parent = head - 1;
adj1.op = 2;
adj1.s = 1;
queue[tail++] = adj1;
flag[0][b] = true;
}
adj1.a = a;
adj1.b = 0;
if(!flag[a][0])
{
adj1.parent = head - 1;
adj1.op = 2;
adj1.s = 2;
queue[tail++] = adj1;
flag[a][0] = true;
}
adj1.a = a + b - B;
if(adj1.a < 0)
{
adj1.a = 0;
adj1.b = a + b;
}
else
{
adj1.b = B;
}
if(!flag[adj1.a][adj1.b])
{
adj1.parent = head - 1;
adj1.op = 3;
adj1.s = 1;
adj1.e = 2;
queue[tail++] = adj1;
flag[adj1.a][adj1.b] = true;
}
adj1.b = a + b - A;
if(adj1.b < 0)
{
adj1.b = 0;
adj1.a = a + b;
}
else
{
adj1.a = A;
}
if(!flag[adj1.a][adj1.b])
{
adj1.parent = head - 1;
adj1.op = 3;
adj1.s = 2;
adj1.e = 1;
queue[tail++] = adj1;
flag[adj1.a][adj1.b] = true;
}
}
if(tag)
print(head - 1);
else
cout<<"impossible\n";
return 0;
}
参见POJ3414
分享到:
相关推荐
**广度优先搜索(BFS)是图论中一种经典的搜索算法,用于遍历或查找树或图。在这个“广度优先搜索BFS-VC6.0全工程”项目中,开发者利用Microsoft Foundation Classes(MFC)框架在Visual C++ 6.0环境下实现了BFS算法...
广度优先搜索(BFS)是另一种用于遍历或搜索树或图的算法。在BFS中,我们首先访问起始节点,然后逐层访问其所有邻居节点,就像一圈一圈向外扩展的波纹一样。在访问完当前层的所有节点之前,不会进入下一层。 在...
**一、广度优先搜索(Breadth-First Search, BFS)** 广度优先搜索是一种在图或树结构中进行遍历的方法,其基本思想是从起点开始,先访问所有距离起点最近的节点,然后依次访问距离起点更远的节点。BFS通常用于寻找...
总结,广度优先搜索BFS是图论和算法中的基础工具,其MATLAB实现简单而高效。通过BFS,我们可以判断图的连通性,解决许多与图相关的问题。在提供的文件"6e69cadf54a041068840903cb45591ed"中,很可能包含了具体的...
本文将深入探讨如何使用Java实现图的邻接矩阵以及如何在该数据结构上执行广度优先搜索(BFS)。 **邻接矩阵** 邻接矩阵是一种二维数组,它用来表示图中顶点之间的连接。如果图是无向的,邻接矩阵是对称的;如果图...
在计算机科学领域,广度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法。它按照从根节点开始,先访问所有距离根节点最近的节点,再访问距离根节点次近的节点,以此类推的顺序进行搜索...
广度优先搜索算法(BFS)是一种常用的图遍历算法,它通过层次遍历图中的每个顶点来实现图的遍历。BFS 算法的基本思想是,从图中的一个顶点出发,先访问该顶点的所有邻接点,然后再访问这些邻接点的邻接点,直到所有...
本篇文章将详细介绍两种常用的图遍历算法——深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS),并探讨它们的应用场景。 #### 二、基本概念 在讨论具体的算法之前,我们需要...
C#,图论与图算法,有向图(Direct Graph)广度优先遍历(BFS,Breadth First Search)算法与源程序 图的广度优先遍历(或搜索)类似于树的广度优先遍历...在像BitTorrent这样的对等网络中,广度优先搜索用于查找所有邻
#### 广度优先搜索(BFS)概述 广度优先搜索(BFS, Breadth-First Search)是一种用于遍历或搜索图的算法。它从图中的某个起始节点开始,优先探索尽可能接近起始节点的所有节点,然后再移动到下一层节点进行探索,...
广度优先搜索(Breadth-First Search,BFS)是一种常用的图搜索算法,用于判断图的连通性。 什么是广度优先搜索算法? 广度优先搜索算法是一种图搜索算法,用于遍历图中的所有节点。该算法的基本思想是,从图中的...
**广度优先搜索 (BFS)** 广度优先搜索(BFS)是一种用于遍历或搜索树或图的算法,其基本思想是从根节点出发,按照层次顺序进行探索。BFS 的特点是先访问离起点近的节点,再访问离起点远的节点,确保在深入探索之前...
广度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法,尤其在解决最短路径问题时非常有效。这个算法从根节点开始,然后逐步探索每一层的节点,确保在访问下一层节点之前访问完当前层的...
这个项目采用了一种名为广度优先搜索(BFS)的算法,这是一种在图论和计算机科学中广泛使用的搜索策略。接下来,我们将深入探讨广度优先搜索算法以及如何在三维空间中应用它来规划无人机的飞行路径。 首先,广度...
本压缩包文件提供了关于解决迷宫问题的算法,特别强调了广度优先搜索(BFS)和深度优先搜索(DFS)这两种策略的比较和优化。 迷宫问题的解决方案通常基于图遍历算法,其中广度优先搜索和深度优先搜索是两种常用的...
图的广度优先搜索(Breadth First Search, BFS)是一种用于遍历或搜索树或图的算法。在图中,BFS从给定的起始节点开始,首先访问与其相邻的所有节点,然后对这些相邻节点的邻居进行访问,以此类推,直到遍历完所有与...
标题"基于BFS广度优先搜索算法matlab代码.zip"表明了这个压缩包包含的是使用MATLAB编程实现的BFS(广度优先搜索)算法的源代码。BFS是一种在图或树中寻找路径的常用算法,它的主要特点是先访问离起点近的节点,再...
广度优先搜索算法(英语:Breadth-First-Search,缩写为 BFS),是一种图形搜索算法。简单的说,BFS 是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。BFS 是一种盲目搜索法,目的是...