poj3414-水杯

题目链接 http://vjudge.net/problem/15208

解题思路

隐式图搜索,只有两个水杯状态表示也比较方便。

代码

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 105
#define QUE_SIZE 10005
struct water {
    int a, b;
    int before;
    char step[20];
    int now;
};
bool ZT[MAX_SIZE][MAX_SIZE];
water Q[QUE_SIZE];
int A, B, C;
int search(int x, int y)
{
    int front = -1, rear = -1;
    Q[++rear].a = x; Q[rear].b = y; ZT[x][y] = true;
    Q[rear].before = -1; Q[rear].now = 0;
    while(front != rear) {
        water u = Q[++front];
        if(u.a == C || u.b == C) return front;
        if(!ZT[A][u.b])
            { Q[++rear].a = A; Q[rear].b = u.b; strcpy(Q[rear].step, "FILL(1)");
            Q[rear].now=u.now+1; Q[rear].before = front; ZT[A][u.b] = true; }
        if(!ZT[u.a][B])
            { Q[++rear].a = u.a; Q[rear].b = B; strcpy(Q[rear].step, "FILL(2)");
            Q[rear].now=u.now+1; Q[rear].before = front; ZT[A][u.b] = true; }
        if(!ZT[0][u.b])
            { Q[++rear].a = 0; Q[rear].b = u.b; strcpy(Q[rear].step, "DROP(1)");
            Q[rear].now=u.now+1; Q[rear].before = front; ZT[0][u.b] = true; }
        if(!ZT[u.a][0])
            { Q[++rear].a = u.a; Q[rear].b = 0; strcpy(Q[rear].step, "DROP(2)");
            Q[rear].now=u.now+1; Q[rear].before = front; ZT[u.a][0] = true; }
        int addW = A-u.a < u.b ? A-u.a : u.b;
        int leftW = A-u.a < u.b ? u.b-A+u.a : 0;
        if(!ZT[u.a+addW][leftW])
            { Q[++rear].a = u.a+addW; Q[rear].b = leftW; strcpy(Q[rear].step, "POUR(2,1)");
            Q[rear].now=u.now+1; Q[rear].before = front; ZT[u.a+addW][leftW] = true; }
        addW = B-u.b < u.a ? B-u.b : u.a;
        leftW = B-u.b < u.a ? u.a-B+u.b : 0;
        if(!ZT[leftW][u.b+addW])
            { Q[++rear].a = leftW; Q[rear].b = u.b+addW; strcpy(Q[rear].step, "POUR(1,2)");
            Q[rear].now=u.now+1; Q[rear].before = front; ZT[leftW][u.b+addW] = true; }
    }
    return -1;
}
void print(int nowStep)
{
    if(nowStep == 0) return ;
    print(Q[nowStep].before);
    printf("%s\n", Q[nowStep].step);
}
int main()
{
    scanf("%d%d%d", &A, &B, &C);
    int Index = search(0,0);
    if(Index == -1) printf("impossible\n");
    else {
        printf("%d\n", Q[Index].now);
        print(Index);
    }
    return 0;
}
时间: 2024-11-10 06:51:17

poj3414-水杯的相关文章

NYOJ21 三个水杯 (经典问题 bfs)

题目描述: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100

nyist_21(三个水杯)(BFS)

描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据 接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积. 第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们

nyoj三个水杯(bfs)

三个水杯 时间限制:1000 ms  |           内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>

南阳21--三个水杯(Bfs)

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的

SDUT 2402 水杯最小表面积问题

水杯 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 天气逐渐变热了,准备考研的高童鞋打算在夏天来临之前自己动手造一个水杯,以备口渴,你知道,高童鞋是个很挑剔而且古怪的的人,他每天喝的水是一定的,一滴也不多喝,一滴也不少喝,而且他用的杯子是个长方体!他认为这样才个性. 现在问题来了,你也知道,考研是多么的艰难,时间是多么的宝贵,钱是多么的不容易赚,所以高童鞋抠一点也正常了.作为他的好朋友,他想让你帮他做一个水杯,当然要花费最少

面向对象-----代码练习(以水杯为例)

package com.hanqi; public class Cup { String YanSe; String PinPai; double ShuiBeiRongLiang; double DangQianRongLiang; public int DQRL= 80; public void jiaShui(double shuiliang){ DangQianRongLiang += shuiliang; System.out.println("拿着"+YanSe+"

程序演义第一回哥伦布水杯戏权贵

2.1第一回 哥伦布水杯戏权贵,阿兰煮酒论编程 第一回介绍的故事是关于航海家哥伦布的,本质上只说了一件事:什么是程序? 程序是怎么回事,和哥伦布又有什么关系呢?说简单很简单,用两个杯子比划一下就有了.故事还要从很久以前说起,1492年10月12日,哥伦布(Christopher Columbus)发现了新大陆--美洲大陆,他是发现美洲的第一人:同样的,在电脑世界中也有许多第一,那问一个最简单的问题:第一个程序是谁发明的呢?对于这个问题,现在很难考证.但经阿兰论证,程序和哥伦布有一定的关系,不信,

poj3414 Pots(BFS+路径输出)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=3414 此题和poj1606一样 :http://blog.csdn.net/u012860063/article/details/37772275 Description You are given two pots, having the volume of A and B liters respectively.

nyoj 21 三个水杯

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的

Nyoj 21 三个水杯(bfs)

三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数. 输入 第一行一个整数N(0<N<50)表示N组测试数据接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的