原题:

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\n",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\n",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 \n",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\n",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\n",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\n",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\n",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\n",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\n",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\n");
else
{
/*for(int i=0;i<6;i++)
{
printf("\n");
for(int j=0;j<6;j++)
{
printf("%d",vis[i][j]);
}
}*/
// printf("tempa=%d tempb=%d\n",tempa,tempb);
rec_a[tot]=tempa;rec_b[tot]=tempb;
while(tempa||tempb)
{
tot++;
// printf("%d %d %d %d\n",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\n",tot);
tot++;
while(tot--)
{
// printf("%d %d %d\n",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)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==2)printf("DROP(1)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==3)printf("FILL(1)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==4)printf("FILL(2)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==5)printf("POUR(2,1)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==6)printf("POUR(1,2)\n");
}
}
}

去掉注释的:

#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\n");
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\n",tot);
tot++;
while(tot--)
{
if(rec_sta[rec_a[tot]][rec_b[tot]]==1)printf("DROP(2)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==2)printf("DROP(1)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==3)printf("FILL(1)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==4)printf("FILL(2)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==5)printf("POUR(2,1)\n");
else if(rec_sta[rec_a[tot]][rec_b[tot]]==6)printf("POUR(1,2)\n");
}
}
}

POJ 3414 解题报告!的更多相关文章

  1. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  2. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  3. POJ 1003 解题报告

    1.问题描述: http://poj.org/problem?id=1003 2.解题思路: 最直观的的想法是看能不能够直接求出一个通项式,然后直接算就好了, 但是这样好水的样子,而且也不知道这个通项 ...

  4. POJ 1004 解题报告

    1.题目描述: http://poj.org/problem?id=1004 2.解题过程 这个题目咋一看很简单,虽然最终要解出来的确也不难,但是还是稍微有些小把戏在里面,其中最大的把戏就是float ...

  5. POJ 1005 解题报告

    1.题目描述   2.解题思路 好吧,这是个水题,我的目的暂时是把poj第一页刷之,所以水题也写写吧,这个题简单数学常识而已,给定坐标(x,y),易知当圆心为(0,0)时,半圆面积为0.5*PI*(x ...

  6. POJ 2411 解题报告

    传送门:http://poj.org/problem?id=2411 题目简述 有一个\(W\)行\(H\)列的广场,需要用\(1*2\)小砖铺满,小砖之间互相不能重叠,问 有多少种不同的铺法? 输入 ...

  7. 广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告

    题目链接:http://poj.org/problem?id=3411 题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途 ...

  8. POJ旅行商问题——解题报告

    旅行商问题 总时间限制: 1000ms 内存限制: 65536kB 描述 某国家有n(1<=n<=10)座城市,给定任意两座城市间距离(不超过1000的非负整数).一个旅行商人希望访问每座 ...

  9. POJ 2182 解题报告

    Lost Cows Time Limit: 1000 MS Memory Limit: 65536 KB Description N (2 <= N <= 8,000) cows have ...

随机推荐

  1. Get the current user permission level on a list item with ecmascript 分类: Sharepoint 2015-07-14 14:13 7人阅读 评论(0) 收藏

    To Check current users permissions using Ecmascript\Javascript client object model SharePoint 2010. ...

  2. BOOL和bool的区别

    一. 1.类型不同 BOOL为int型 bool为布尔型 2.长度不同 bool只有一个字节 BOOL长度视实际环境来定,一般可认为是4个字节 3.取值不同 bool取值false和true,是0和1 ...

  3. RBAC类使用

    1.实现首先我们先简单理解一下RBAC,顾名思义,RBAC是基于角色的权限设计.既然根据角色去分权限,那么我们就得有角色表,权限表,角色对应权限表,这是最基本的.角色是什么,就是你的身份,你的职位,也 ...

  4. js图片放大效果

    实现购物网站里的图片放大效果,jqzoom很好用.今天才接触它,很快就上手了.看了一个示例,在放大图像上方貌似有水印,后经排查,原来是图片的标题,然后设置title为false,搞定.

  5. 存到cookie里能提高性能吗?

    今天刚刚看了篇微信,大体意思是说g哥之类的网站把很多存session的东西都放cookie里了,可减少服务器的负担种种.然后我就发现我对request到application的记忆有些模糊了,哪些是在 ...

  6. s验证数据库中字段值是否重复

    daoImpl: public String isVipCode(String vipcode) { String sql = "from FfzjUserEntity where vip_ ...

  7. JSP数据交互(二)和Servlet基础

    01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...

  8. form input file 图片上传360IE兼容问题

    <form action="" class="form-box" class="form_box" enctype="mul ...

  9. Hadoop中如何查看文件的block size

    因为对控制文件的分片数目,进而控制文件的map个数非常感兴趣,因此有查找如下资料的需求.下面来看看我总结的吧:) 当向HDFS上写文件时,可以通过设置dfs.blocksize配置项来设置文件的blo ...

  10. Parameter index out of range (2 > number of parameters, which is 1)

    今天在实现一个功能时遇到一个问题,解决了很久.结果是#{}与${}使用错误的原因.但是具体原因还不是很清楚,写此篇总结,知道的可以交流. 具体描述为:通过教师的头衔(1高级讲师2首席讲师)及名称进行模 ...