程序设计思维与实践 Week2 作业 B-Pour Water

题目链接: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;
}
发布了24 篇原创文章 · 获赞 0 · 访问量 522

猜你喜欢

转载自blog.csdn.net/qq_43666020/article/details/104687748
今日推荐