zoukankan      html  css  js  c++  java
  • POJ 3414 解题报告!

    原题:
    Pots
    Time Limit: 1000MS Memory Limit: 65536K
    Total Submissions: 13227 Accepted: 5550 Special Judge
    Description

    You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:

    FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;
    DROP(i) empty the pot i to the drain;
    POUR(i,j) pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j).
    Write a program to find the shortest possible sequence of these operations that will yield exactly C liters of water in one of the pots.

    Input

    On the first and only line are the numbers A, B, and C. These are all integers in the range from 1 to 100 and C≤max(A,B).

    Output

    The first line of the output must contain the length of the sequence of operations K. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.

    Sample Input

    3 5 4
    Sample Output

    6
    FILL(2)
    POUR(2,1)
    DROP(1)
    POUR(2,1)
    FILL(2)
    POUR(2,1)
    Source

    Northeastern Europe 2002, Western Subregion

    题意:给了你两个瓶子 (姑且认为它们分别为M和N吧)
    让你做三种操作:
    1.把M瓶(N瓶)装满;
    2.把M瓶(N瓶)中的水倒掉;
    3.把M(N)瓶里的水倒进N(M)瓶中去。(如果会溢出,那么倒到正好装满为止,剩下的水还在瓶子里);
    问 经过哪些操作能使瓶中(不管是M瓶还是N瓶)剩余的水量为C,并输出操作步骤。(难点)
    如果不能 输出impossible。(被impossible坑害一次)。。。

    解题思路 :BFS,大致分为6个入口 两个瓶子互相倒水的那步其实可以分为溢出和不溢出两种情况。 一共就算8个入口吧。 这个搜索极其容易把下标搞错!!注意注意千万别错,否则死都不知道自己怎么死的。。。

    难的是记录步骤 我选用的是开仨数组。 reca记录在进行那一步之前M瓶的状态,recb记录在进行那一步之前N瓶的状态,rec_sta记录进行的是哪一步操作。搜出来结果以后往回推,顺便记录进行了几步和每一步分别是什么。逆序输出答案。

    直接扔代码啦(这个是没有去掉注释的)

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    int m,n,k,reca[222][222],recb[222][222],rec_sta[222][222],tempa,tempb;
    int rec_a[66666],rec_b[66666],tot=0;
    bool vis[222][222];
    queue<int> a,b;
    bool bfs()
    {
        while(!a.empty())
        {
            tempa=a.front(),tempb=b.front();
            a.pop();b.pop();
    //      printf("tempa=%d  tempb=%d    reca[tempa][tempb]=%d  recb[tempa][tempb]=%d
    ",tempa,tempb,reca[tempa][tempb],recb[tempa][tempb]);
            if(tempa==k||tempb==k)
            return 1;
            if(!vis[tempa][0])//DROP(2) 
            {
                a.push(tempa);b.push(0);vis[tempa][0]=1;
                reca[tempa][0]=tempa;recb[tempa][0]=tempb;rec_sta[tempa][0]=1;//printf("1 %d 0
    ",tempa);
            }
            if(!vis[0][tempb])//DROP(1) 
            {
                a.push(0);b.push(tempb);vis[0][tempb]=1;
                reca[0][tempb]=tempa;recb[0][tempb]=tempb;rec_sta[0][tempb]=2;//printf("2 0 %d 
    ",tempb);
            }
            if(!vis[m][tempb])//FILL(1) 
            {
                a.push(m);b.push(tempb);vis[m][tempb]=1;
                reca[m][tempb]=tempa;recb[m][tempb]=tempb;rec_sta[m][tempb]=3;//printf("3 %d %d
    ",m,tempb);
            }
            if(!vis[tempa][n])//FILL(2) 
            {
                a.push(tempa);b.push(n);vis[tempa][n]=1;
                reca[tempa][n]=tempa;recb[tempa][n]=tempb;rec_sta[tempa][n]=4;// printf("4 %d %d
    ",tempa,n);
            }
            int t=tempa+tempb;
            if(t<=m&&!vis[t][0])//POUR(2,1) 
            {
                a.push(t);b.push(0);vis[t][0]=1;
                reca[t][0]=tempa;recb[t][0]=tempb;rec_sta[t][0]=5; //printf("5 %d 0
    ",t);
            }
            if(t>m&&!vis[m][t-m])//POUR(2,1)
            {
                a.push(m);b.push(t-m);vis[m][t-m]=1;
                reca[m][t-m]=tempa;recb[m][t-m]=tempb;rec_sta[m][t-m]=5;//printf("5 %d %d
    ",k,t-k);
            }
            if(t<=n&&!vis[0][t])//POUR(1,2)
            {
                a.push(0);b.push(t);vis[0][t]=1;
                reca[0][t]=tempa;recb[0][t]=tempb;rec_sta[0][t]=6;//printf("6 %d %d
    ",0,t);
            }
            if(t>n&&!vis[t-n][n])//POUR(1,2)
            {
                a.push(t-n);b.push(n);vis[t-n][n]=1;
                reca[t-n][n]=tempa;recb[t-n][n]=tempb;rec_sta[t-n][n]=6;//printf("6 %d %d
    ",t-k,k);
            }
        }
        return 0;
    }
    int main()
    {
        scanf("%d%d%d",&m,&n,&k);
        a.push(0);b.push(0);vis[0][0]=true;
        if(!bfs())
            printf("impossible
    ");
        else
        {
            /*for(int i=0;i<6;i++)
            {
                printf("
    ");
                for(int j=0;j<6;j++)
                {
                    printf("%d",vis[i][j]);
                }
            }*/
    //      printf("tempa=%d  tempb=%d
    ",tempa,tempb);
            rec_a[tot]=tempa;rec_b[tot]=tempb;
            while(tempa||tempb)
            {
                tot++;
    //          printf("%d  %d  %d  %d
    ",tempa,tempb,reca[tempa][tempb],recb[tempa][tempb]);
                int t=reca[tempa][tempb];
                rec_a[tot]=t;
                tempb=recb[tempa][tempb];
                tempa=t;
                rec_b[tot]=tempb;
            }
            printf("%d
    ",tot);
            tot++; 
            while(tot--)
            {
    //          printf("%d   %d   %d
    ",rec_a[tot],rec_b[tot],rec_sta[rec_a[tot]][rec_b[tot]]); 
                if(rec_sta[rec_a[tot]][rec_b[tot]]==1)printf("DROP(2)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==2)printf("DROP(1)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==3)printf("FILL(1)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==4)printf("FILL(2)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==5)printf("POUR(2,1)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==6)printf("POUR(1,2)
    ");
            }
        }
    } 

    这里写图片描述

    去掉注释的:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    int m,n,k,reca[222][222],recb[222][222],rec_sta[222][222],tempa,tempb;
    int rec_a[66666],rec_b[66666],tot=0;
    bool vis[222][222];
    queue<int> a,b;
    bool bfs()
    {
        while(!a.empty())
        {
            tempa=a.front(),tempb=b.front();
            a.pop();b.pop();
            if(tempa==k||tempb==k)
            return 1;
            if(!vis[tempa][0])
            {
                a.push(tempa);b.push(0);vis[tempa][0]=1;
                reca[tempa][0]=tempa;recb[tempa][0]=tempb;rec_sta[tempa][0]=1;
            }
            if(!vis[0][tempb])
            {
                a.push(0);b.push(tempb);vis[0][tempb]=1;
                reca[0][tempb]=tempa;recb[0][tempb]=tempb;rec_sta[0][tempb]=2;
            }
            if(!vis[m][tempb])
            {
                a.push(m);b.push(tempb);vis[m][tempb]=1;
                reca[m][tempb]=tempa;recb[m][tempb]=tempb;rec_sta[m][tempb]=3;
            }
            if(!vis[tempa][n])
            {
                a.push(tempa);b.push(n);vis[tempa][n]=1;
                reca[tempa][n]=tempa;recb[tempa][n]=tempb;rec_sta[tempa][n]=4;
            }
            int t=tempa+tempb;
            if(t<=m&&!vis[t][0])
            {
                a.push(t);b.push(0);vis[t][0]=1;
                reca[t][0]=tempa;recb[t][0]=tempb;rec_sta[t][0]=5; 
            }
            if(t>m&&!vis[m][t-m])
            {
                a.push(m);b.push(t-m);vis[m][t-m]=1;
                reca[m][t-m]=tempa;recb[m][t-m]=tempb;rec_sta[m][t-m]=5;
            }
            if(t<=n&&!vis[0][t])
            {
                a.push(0);b.push(t);vis[0][t]=1;
                reca[0][t]=tempa;recb[0][t]=tempb;rec_sta[0][t]=6;
            }
            if(t>n&&!vis[t-n][n])
            {
                a.push(t-n);b.push(n);vis[t-n][n]=1;
                reca[t-n][n]=tempa;recb[t-n][n]=tempb;rec_sta[t-n][n]=6;
            }
        }
        return 0;
    }
    int main()
    {
        scanf("%d%d%d",&m,&n,&k);
        a.push(0);b.push(0);vis[0][0]=true;
        if(!bfs())
            printf("impossible
    ");
        else
        {
            rec_a[tot]=tempa;rec_b[tot]=tempb;
            while(tempa||tempb)
            {
                tot++;
                int t=reca[tempa][tempb];
                rec_a[tot]=t;
                tempb=recb[tempa][tempb];
                tempa=t;
                rec_b[tot]=tempb;
            }
            printf("%d
    ",tot);
            tot++; 
            while(tot--)
            {
                if(rec_sta[rec_a[tot]][rec_b[tot]]==1)printf("DROP(2)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==2)printf("DROP(1)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==3)printf("FILL(1)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==4)printf("FILL(2)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==5)printf("POUR(2,1)
    ");
                else if(rec_sta[rec_a[tot]][rec_b[tot]]==6)printf("POUR(1,2)
    ");
            }
        }
    } 

    这里写图片描述

  • 相关阅读:
    Cesium加载Geowebcache切片
    Vue开发--脚手架的搭建
    OpenLayers动态测量距离和面积,并可自定义测量的线样式
    OpenLayers要素拖拽
    改造SuperMap的DrawHandler接口,自定义绘制的图形样式
    Cesium动态绘制实体(点、标注、面、线、圆、矩形)
    ArcMap制图遇到的小问题
    GeoServer 2.15.2版本跨域问题解决方法
    MySQL 8.0 主从同步
    Service__cmd--MySQL安装并连接SQLyog
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/5831189.html
Copyright © 2011-2022 走看看