广搜最短路径变形,(POJ3414)

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

解题报告:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

struct Node
{
    int a,b,step;
    char str[111][111];
};

int A,B,C;
bool mark[111][111];
bool bfs()
{
    memset(mark,false,sizeof(mark));
    queue<Node>que;
    Node p,q;
    p.a=0,p.b=0,p.step=0;
    que.push(p);
    mark[0][0]=true;
    while(!que.empty())
    {
        p=que.front();
        que.pop();
        if(p.a==C||p.b==C)
        {
            printf("%d\n",p.step);
            for(int i=1; i<=p.step; i++)
            {
                printf("%s\n",p.str[i]);
            }
            return true;
        }
        if(p.a==0)
        {
            q=p;
            q.a=A;
            q.step++;
            strcpy(q.str[q.step],"FILL(1)");
            if(!mark[q.a][q.b])
            {
                mark[q.a][q.b]=true;
                que.push(q);
            }
        }
        else if(p.a<=A)
        {
            q=p;
            q.a=0;
            q.step++;
            strcpy(q.str[q.step],"DROP(1)");
            if(!mark[q.a][q.b])
            {
                mark[q.a][q.b]=true;
                que.push(q);
            }
            if(p.b<B)
            {
                q=p;
                if(q.a+q.b<=B)
                {
                    q.b+=q.a;
                    q.a=0;
                }
                else
                {
                    q.a=(q.b+q.a)-B;
                    q.b=B;
                }
                q.step++;
                strcpy(q.str[q.step],"POUR(1,2)");
                if(!mark[q.a][q.b])
                {
                    mark[q.a][q.b]=true;
                    que.push(q);
                }
            }
        }
        if(p.b==0)
        {
            q=p;
            q.b=B;
            q.step++;
            strcpy(q.str[q.step],"FILL(2)");
            if(!mark[q.a][q.b])
            {
                mark[q.a][q.b]=true;
                que.push(q);
            }
        }
        else if(p.b<=B)
        {
            q=p;
            q.b=0;
            q.step++;
            strcpy(q.str[q.step],"DROP(2)");
            if(!mark[q.a][q.b])
            {
                mark[q.a][q.b]=true;
                que.push(q);
            }
            if(p.a<A)
            {
                q=p;
                if(q.b+q.a<=A)
                {
                    q.a+=q.b;
                    q.b=0;
                }
                else
                {
                    q.b=(q.b+q.a)-A;
                    q.a=A;
                }
                q.step++;
                strcpy(q.str[q.step],"POUR(2,1)");
                if(!mark[q.a][q.b])
                {
                    mark[q.a][q.b]=true;
                    que.push(q);
                }
            }
        }
    }
    return false;
}

int main()
{
    while(~scanf("%d%d%d",&A,&B,&C))
    {
        if(!bfs())puts("impossible");
    }
    return 0;
}
时间: 2024-08-03 04:10:55

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

Poj3414广搜

<span style="color:#330099;">/* D - D Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3414 Description You are given two pots, having the volume of A and B liters respectively. The follow

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And

宽搜和广搜、

广搜与深搜的小区别 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化). 像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的.深搜就

nyoj 523 双向广搜

题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstdio> #include<queue> using namespace std; /* 用普通搜索TLE,已知起点和终点,可以考虑双向广搜或A*算法加速搜索 双向广搜,一个方向从出发点向终点搜索,一个方向从终点向出发点搜索,搜索到相同的结点时,即找到最短路径. */ const int N

第一次广搜!HDU1548--A Strange Lift

一上来看见题目就用了深搜(因为只会深搜)果断内存超限(据说时间也会超限)无奈只好开始用广搜 其实广搜的思路和深搜有很多类似的地方 不过实现的过程中用到了队列 因此有点难以理解(好吧我个人认为) 这题是最基本的广搜了 只是一个二叉树 所以先画个二叉树出来看一下广搜的顺序 每一个节点下一层的节点入队之后就把这个节点出队 对每一个节点 bfs的顺序是这样的 1.将这个节点的左节点入队(要判断左节点是否已经入队以及是否合适) 2.将这个节点的右节点入队(同样也要盘算右节点是否已经入队以及是否满足条件)

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

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要

poj 3278 Catch That Cow(广搜)

Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45087   Accepted: 14116 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,00

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

Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 14   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Angel was caught by the MOLIGPY

ACdream 1191(广搜)

题目链接:http://acdream.info/problem?pid=1191 Dragon Maze Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description You are the prince of Dragon Kingdom and your kingdom is in danger o