题目链接:B-Pour Water
题目描述:
倒水问题 “fill A” 表示倒满A杯,"empty A"表示倒空A杯,“pour A B” 表示把A的水倒到B杯并且把B杯倒满或A倒空。
Input:
输入包含多组数据。每组数据输入 A, B, C 数据范围 0 < A <= B 、C <= B <=1000 、A和B互质。
Output:
你的程序的输出将由一系列的指令组成。这些输出行将导致任何一个罐子正好包含C单位的水。每组数据的最后一行输出应该是“success”。输出行从第1列开始,不应该有空行或任何尾随空格。
Sample Input:
2 7 5
2 7 4
Sample Output:
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
success
Notes:
如果你的输出与Sample Output不同,那没关系。对于某个"A B C"本题的答案是多解的,不能通过标准的文本对比来判定你程序的正确与否。 所以本题由 SPJ(Special Judge)程序来判定你写的代码是否正确。
思路:
本题中的答案是多解的,由于B>=A,所以输出结果只要让B中的水满足C单位即可,没有要求步骤最简化,则可以先往A中倒水,然后把A中的水倒入B中,如果刚好满足条件就输出,否则倒出B中的水,直到满足条件。
总结:
在做本题时并没有想到要去往单一的容器中倒水(因为没看到notes),首先考虑和题目A有类似的地方,然后就用结构体保存两个容器的水量,容器中的水之间有着相互的关系,然后进行类似搜索的方法,结果二维数组忘记初始化导致了一系列问题,在devc++上可以运行,但是vj上总是TE或ME,结果发现notes之后,用简便的的方法也能解决。
代码:
#include<iostream>
using namespace std;
int main()
{
int A,B,C;
while(cin>>A>>B>>C){
int a=0,b=0;//用于记录A、B中现存的水量
if(B==1){
cout<<"fill B"<<endl;
cout<<"success"<<endl;
break ;
}
while(b!=C){
cout<<"fill A"<<endl;
cout<<"pour A B"<<endl;
b+=A;
if(b>B){
cout<<"empty B"<<endl;
b-=B;
cout<<"pour A B"<<endl;
}
}
cout<<"success"<<endl;
}
return 0;
}
未成功代码:
#include<iostream>
#include <cstring>
#include<vector>
#include<queue>
using namespace std;
struct node{
int x,y;
vector<string> vec;
};
int main(){
int A,B,C;
bool vis[10000][10000];
while(cin>>A>>B>>C){
memset(vis,0,sizeof(vis));
queue<node> q;
node current;
current.x=current.y=0;
q.push(current);
while(!q.empty()){
node nxt;
nxt=q.front();
q.pop();
if(nxt.x!=A){
node now=nxt;
now.x=A;
now.vec.push_back("fill A");
if(!vis[now.x][now.y]){
q.push(now);
vis[now.x][now.y]=1;
}
}
if(nxt.y!=B){
node now=nxt;
now.y=B;
now.vec.push_back("fill B");
if(!vis[now.x][now.y]){
q.push(now);
vis[now.x][now.y]=1;
}
}
if(nxt.x!=0){
node now=nxt;
now.x=0;
now.vec.push_back("empty A");
if(!vis[now.x][now.y]){
q.push(now);
vis[now.x][now.y]=1;
}
}
if(nxt.y!=0){
node now=nxt;
now.y=0;
now.vec.push_back("empty B");
if(!vis[now.x][now.y]){
q.push(now);
vis[now.x][now.y]=1;
}
}
if(nxt.x!=0&&nxt.y!=B){
node now=nxt;
if(now.x<=B-now.y){
now.y+=now.x;
now.x=0;
}
else{
now.x-=B-now.y;
now.y=B;
}
now.vec.push_back("pour A B");
if(!vis[now.x][now.y]){
q.push(now);
vis[now.x][now.y]=1;
}
}
if(nxt.y!=0&&nxt.x!=B){
node now=nxt;
if(now.y<=A-now.x){
now.x+=now.y;
now.y=0;
}
else{
now.y-=A-now.x;
now.x=A;
}
now.vec.push_back("pour B A");
if(!vis[now.x][now.y]){
q.push(now);
vis[now.x][now.y]=1;
}
}
if(nxt.y==C){
for(int i=0;i<nxt.vec.size();i++)
cout<<nxt.vec[i]<<endl;
break;
}
}
cout<<"success"<<endl;
}
return 0;
}