`

poj 3414BFS

阅读更多

   题意:给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。

      1.FILL(i):将ipot倒满水。

      2.DROP(i):将ipot倒空水。

      3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。

  思路:bfs求最短路径,与1426类似,只是每个节点的子节点数为6个而已。

代码如下:

#include<iostream>
using namespace std;
const int Max = 101;

 

struct node
{
    int ope;  int a;  int b;  node *pre;
}que[Max * Max];  //  队列结点,ope记录第几种操作,a,b记录此结点两个pot的水的数量。


bool vis[Max][Max];

char str[6][10] = {"FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)"};

 // 各操作对应输出的字符串。

 

int min(int a, int b)
{
    return a < b ? a : b;
}

 

void print(node now)
{
    if(now.pre != NULL)
	{
        print(*now.pre);
        cout << str[now.ope] << endl;
    }
}//递归输出答案个人认为写得很巧妙

 

void bfs(int a, int b, int c)
{
    int steps = 0;
    int head = 0, tail = 1;
    que[0].a = que[0].b = 0;
    que[0].pre = NULL; 
    while(tail - head > 0)
	{
        int count = tail - head;
        while(count --)//每一种情况都要考虑六种情况
		{
            node now = que[head];
            if(now.a == c || now.b == c)
			{
                cout << steps << endl;
                print(now);
                return;
            }
            if(!vis[a][now.b])
			{
                que[tail].ope = 0;
                que[tail].a = a;
                que[tail].b = now.b;
                que[tail].pre = &que[head];
                vis[a][now.b] = true;
                tail ++;
            }
            if(!vis[now.a][b])
			{
                que[tail].ope = 1;
                que[tail].a = now.a;
                que[tail].b = b;
                que[tail].pre = &que[head];
                vis[now.a][b] = true;
                tail ++;
            }
            if(!vis[0][now.b])
			{
                que[tail].ope = 2;
                que[tail].a = 0;
                que[tail].b = now.b;
                que[tail].pre = &que[head];
                vis[0][now.b] = true;
                tail ++;
            }
           if(!vis[now.a][0])
		   {
                que[tail].ope = 3;
                que[tail].a = now.a;
                que[tail].b = 0;
                que[tail].pre = &que[head];
                vis[now.a][0] = true;
                tail ++;
            }
            int wat1 = min(now.a, b - now.b);
            if(!vis[now.a - wat1][now.b + wat1])
			{
                que[tail].ope = 4;
                que[tail].a = now.a - wat1;
                que[tail].b = now.b + wat1;
                que[tail].pre = &que[head];
                vis[now.a - wat1][now.b + wat1] = true;
                tail ++;
            }
            int wat2 = min(a - now.a, now.b);
            if(!vis[now.a + wat2][now.b - wat2])
			{
                que[tail].ope = 5;
                que[tail].a = now.a + wat2;
                que[tail].b = now.b - wat2;
                que[tail].pre = &que[head];
                vis[now.a + wat2][now.b - wat2] = true;
                tail ++;
            }
            head ++;
        }
        steps ++;
    }
    cout << "impossible" << endl;
}

 

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    memset(vis, false, sizeof(vis));//初始化
    vis[0][0] = true;//初始化
    bfs(a, b, c);
    return 0;
}

 

 

 

分享到:
评论

相关推荐

    NOI2002.rar_NOI 2002 dragon_poj bfs

    标题中的“NOI2002.rar_NOI 2002 dragon_poj bfs”提到了几个关键元素:NOI(全国青少年信息学奥林匹克),2002年赛事,dragon问题,以及poj_bfs。这表明我们即将讨论的是2002年全国青少年信息学奥林匹克竞赛中的...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    POJ3026-Borg Maze【BFS+Prim】

    《POJ3026-Borg Maze:BFS与Prim算法的应用解析》 在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    LeetCode判断字符串是否循环-Leetcode:刷!

    BFS POJ 3278 POJ 1426 POJ 3126 POJ 3414 POJ 2251 简单搜索技巧和剪枝 POJ 1010 :star: POJ 2362 POJ 1011(搜索+剪枝) POJ 1416 POJ 2676 POJ 1129:white_question_mark: 数据结构 串 POJ 1016 POJ 1035 POJ ...

    poj各种分类

    包括深度优先遍历(DFS)和广度优先遍历(BFS),用于探索图的所有节点,是解决许多图问题的基础,如poj1860和poj3259所示。 #### 最短路径算法 Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有...

    POJ1753-Flip Game

    两个解决方案的代码文件“POJ1753-Flip Game(BFS+bit).cpp”和“POJ1753-Flip Game(DFS+enum).cpp”分别实现了BFS和DFS策略。阅读这些代码可以帮助理解如何将理论转换为实际的程序实现。 五、文档说明 “POJ1753-...

    POJ各题算法分类和题目推荐 ACM必看

    POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...

    acm训练计划(poj的题)

    - (poj1328, poj2109, poj2586):介绍各种搜索算法,如深度优先搜索(DFS)、广度优先搜索(BFS)等。 3. **排序与查找**: - 提供对排序和查找算法的理解与应用指导,包括快速排序、归并排序、二分查找等经典...

    acm新手刷题攻略之poj

    (https://vjudge.net/problem/POJ-3278)、[poj1426](https://vjudge.net/problem/POJ-1426)、[poj3126](https://vjudge.net/problem/POJ-3126)、[poj3087](https://vjudge.net/problem/POJ-3087)、[poj3414]...

    POJ1011-Sticks

    【标题】"POJ1011 - Sticks" 是一个经典的计算机编程竞赛题目,源自北京大学的在线评测系统POJ(PKU Online Judge)。这个题目挑战程序员解决与几何图形和数学逻辑相关的问题。 【描述】该题目的核心是求解在二维...

    ACM-POJ 算法训练指南

    2. **组合数学**:如排列组合计算(poj3278, poj1426, poj3126, poj3087.poj3414)。 3. **矩阵运算**:矩阵乘法和矩阵快速幂(poj2531, poj1416, poj2676, 1129)。 ### 五、状态压缩 1. **状态压缩动态规划**:...

    POJ2531-Network Saboteur

    【标题】"POJ2531-Network Saboteur" 是一道来自北京大学在线判题系统POJ(Problem Set)的编程题目。该题目属于算法竞赛中的经典问题,旨在考察参赛者的图论知识和编程能力。 【描述】"北大POJ2531-Network ...

    POJ 部分题解 解题报告

    5. **PKU 1010 搜索.txt**:搜索问题通常包括深度优先搜索(DFS)、广度优先搜索(BFS)或A*搜索算法。可能需要解决路径查找、迷宫求解等问题。 6. **POJ 3468 线段树--long long VS int.txt**:线段树是处理区间...

    强大的poj分类

    ### 强大的POJ分类解析 #### 一、引言 POJ(Peking Online Judge)作为中国最早的一批在线编程评测系统之一,为广大学习算法与数据结构的同学提供了丰富的资源。它不仅包含了各类经典的算法题目,还通过详细的分类...

    POJ3126-Prime Path

    【标题】"POJ3126-Prime Path" 是北京大学在线编程平台POJ上的一道题目,主要涉及算法和数论方面的知识。这道题目要求我们寻找一条从图中的某个节点出发,经过一系列相邻节点,且每个节点的值都是素数的路径。 ...

    acm poj300题分层训练

    poj2488、poj3083等是DFS的练习,poj3278、poj1426等是BFS的题目。 5. **动态规划**和**数学**:poj1837、poj1276是简单的动态规划问题,poj3267、poj1836等进一步强化了DP,poj3252、poj1850等则涉及组合数学,poj...

    经典 的POJ 分类

    - POJ 2251:BFS的应用场景。 #### 其他搜索算法 - **题目示例**: - POJ 3278、POJ 1426:特殊搜索策略的应用。 - POJ 3126、POJ 3087:复杂搜索策略解决实际问题。 ### 动态规划 #### 一维动态规划 - **题目...

    POJ1039-Pipe

    POJ1039-Pipe可能需要应用到的算法包括但不限于深度优先搜索(DFS)、广度优先搜索(BFS)、动态规划、贪心算法或图的遍历算法。 4. **图论**:由于题目名为"Pipe",很可能涉及到图的结构,比如管道之间的连接可以...

    poj1094 拓扑排序

    题目“poj1094”即是要求我们实现一个拓扑排序的解决方案。 **拓扑排序**的基本思想是:对于有向无环图G,如果存在一条从顶点u到顶点v的路径,那么在拓扑排序结果中,u一定出现在v之前。拓扑排序可以得到多个不同的...

Global site tag (gtag.js) - Google Analytics