poj3414 Pots (BFS)

Pots

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12198   Accepted: 5147   Special Judge

Description

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

  1. FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap;
  2. DROP(i)      empty the pot i to the drain;
  3. 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

空杯子倒水问题,这题比较简单,只有两个杯子,最初的时候都是空的,要倒出指定量的水有三种操作:

1、FILL(i)        把第i个杯子装满(i=0,1)

2、DROP(i)      把第i个杯子倒空

3、POUR(i,j)    把i的水倒入到j中,直到j满或i倒完

我的想法:把a->b,b->c,。。。。共6种倒水方法一个一个列出来,而每种都是一样的讨论方法,

虽然很好做,但对于我这样的入门级水手来说还是写不出太好看的代码,所以。。。。

看看吧,看不懂再去看看网上别人的==||

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=500;
bool vis[maxn][maxn];
int fa[maxn][maxn];
int op[maxn][maxn];
int sa,sb,sc;
struct node{
   int a,b,step;
};
char ans[6][20]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
void print(int a ,int b){
     if(op[a][b]==-1)
     return;
     else{
         print(fa[a][b]/1000,fa[a][b]%1000);
         printf("%s\n",ans[op[a][b]]);
     }
}

bool bfs(){
   node u,v;
   u.a=0,u.b=0;
   u.step=0;
   queue<node>q;
   q.push(u);
   memset(op,0,sizeof(op));
   memset(vis,false,sizeof(vis));
   memset(fa,0,sizeof(fa));
    op[0][0]=-1;
    fa[0][0]=0;
    vis[0][0]=true;
   while(!q.empty()){
       u=q.front();
       q.pop();
       if(u.a==sc||u.b==sc){
          printf("%d\n",u.step);
          print(u.a,u.b);
          return true;
       }
       v=u;

       if(u.a!=sa){
          v.a=sa;
          if(!vis[v.a][v.b]){
              v.step++;
              q.push(v);
              op[v.a][v.b]=0;
              vis[v.a][v.b]=true;
              fa[v.a][v.b]=u.a*1000+u.b;
          }
       }v=u;
       if(u.b!=sb){v.b=sb;
            if(!vis[v.a][v.b]){
                v.step=u.step+1;
                q.push(v);
                op[v.a][v.b]=1;
                vis[v.a][v.b]=1;
                fa[v.a][v.b]=u.a*1000+u.b;
            }
        }v=u;
        if(u.a){v.a=0;
            if(!vis[v.a][v.b]){
                v.step++;
                q.push(v);
                op[v.a][v.b]=2;
                vis[v.a][v.b]=true;
                fa[v.a][v.b]=u.a*1000+u.b;
            }
        }v=u;
        if(u.b){v.b=0;
            if(!vis[v.a][v.b]){
                v.step++;
                q.push(v);
                op[v.a][v.b]=3;
                vis[v.a][v.b]=true;
                fa[v.a][v.b]=u.a*1000+u.b;
            }
        }v=u;
        if(u.a){
            if(v.a>=sb-u.b&&u.b!=sb){v.a-=(sb-u.b);v.b=sb;}
            else if(v.a<sb-u.b){v.a=0;v.b+=u.a;}
            if(!vis[v.a][v.b]){
                v.step++;
                q.push(v);
                op[v.a][v.b]=4;
                vis[v.a][v.b]=true;
                fa[v.a][v.b]=u.a*1000+u.b;
            }
        }v=u;
        if(u.b)
        {
            if(v.b>=sa-u.a&&u.a!=sa){v.b-=(sa-u.a);v.a=sa;}
            else if(v.b<sa-u.a){v.b=0;v.a+=u.b;}
            if(!vis[v.a][v.b]){
                v.step++;
                q.push(v);
                op[v.a][v.b]=5;
                vis[v.a][v.b]=true;
                fa[v.a][v.b]=u.a*1000+u.b;
            }
        }

   }
   return false;
}
int main(){
    while(scanf("%d%d%d",&sa,&sb,&sc)!=EOF){
       bool flag=bfs();

       if(!flag)
       printf("impossible\n");
    }
    return 0;
}
时间: 2024-10-07 00:07:27

poj3414 Pots (BFS)的相关文章

poj3414——Pots(BFS)

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

POJ-3414 Pots (BFS)

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

poj3414 Pots(BFS)

题目链接 http://poj.org/problem?id=3414 题意 有两个杯子,容量分别为A升,B升,可以向杯子里倒满水,将杯子里的水倒空,将一个杯子里的水倒到另一个杯子里,求怎样倒才能使其中的一个杯子里的水恰为C升,输出最少步数和操作:如果不能倒到C升,输出“impossible”. 思路 这题与poj1606基本相同,在poj1606的基础上添加了输出最少步数,修改了操作的表示,以及不可能达到目标时输出impossible.将poj1606的代码略作修改即可. 代码 1 #incl

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.

pots(BFS)

D - Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: Input On the first and

POJ 3414 Pots(罐子)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

USACO抓牛catchcow (bfs)

这题是黄巨大出的比赛题. http://poj.org/problem?id=3278 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,000) on a number line and the cow is at a point K (0 ≤ K ≤

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

牛汇(BFS)入金具体流程(图文指导)

牛汇开户流程:bfsforex牛汇入金教程 所谓入金,也就是充值的意思,必须充钱到平台才能进行外汇交易.首先,我们先登录bfsforex牛汇官方网站,在交易办公室功能区域下面,点击账户入金: 为您提供中国各大银行的网银支付解决方案,支持人民币支付,和信用卡入金,入金是实时到账的. 牛汇(BFS)入金具体流程(图文指导),布布扣,bubuko.com