您的位置:首页 > 其它

ZOJ 1005 Jugs

2011-05-25 18:26 316 查看
第一种给出的是一种搜索算法,时间复杂度可能会比较高,但是比较容易理解

就是通过标记记录走过的点,我们在这里标的使A瓶和B瓶的含水量。然后通过队列寻找下一个更新的点,直到找到它。

#include<cstdio>
#include<string>
#include<iostream>
#include<queue>
#include<cstring>
#include<stack>
using namespace std;
string markway[2][5]={{"fill A","empty A","pour A B"},
{"fill B","empty B","pour B A"}};
#define M 1001
bool jugs[M][M];
int n,m,d;
typedef struct point{
int x,y;
}point;
typedef struct way{
string rote;
point p;
}way;
way move[M][M];
point bfs(){
memset(jugs,false,sizeof(jugs));
point st,pre,now[6];
st.x=st.y=0;
queue<point >q;
q.push(st),jugs[st.x][st.y]=true;
while(!q.empty()){
pre=q.front();q.pop();
int i;
for(i=0;i<6;i++)
now[i]=pre;
now[0].x=n,now[3].y=m;
now[1].x=0,now[4].y=0;
if(now[2].x>=m-now[2].y) now[2].x-=(m-now[2].y),now[2].y=m;
else now[2].y+=now[2].x,now[2].x=0;
if(now[5].y>=m-now[5].x) now[5].y-=(n-now[5].x),now[5].x=n;
else now[5].x+=now[5].y,now[5].y=0;
for(i=0;i<6;i++){

if(!jugs[now[i].x][now[i].y]){
jugs[now[i].x][now[i].y]=true;
q.push(now[i]);
move[now[i].x][now[i].y].p=pre;
move[now[i].x][now[i].y].rote=markway[i/3][i%3];
}
if(now[i].x==d || now[i].y==d)
return now[i];
}
}
}
void output(point post){
stack< string > s;
s.push("success");
while(post.x || post.y){
s.push(move[post.x][post.y].rote);
post=move[post.x][post.y].p;

}
while(!s.empty())
cout<<s.top()<<endl,s.pop();
}
int main(){
point post;
while( cin>>n>>m>>d ) {
post=bfs();
output(post);
}
return 0;
}


第二种算法给出的是一个以倒水问题为基础的数学方法,指的是拿一个较小的瓶子一直往大的里面倒,当大瓶满的时候就倒空,当小瓶没有水的时候就加满,以为给出的数据A B是互素的,所以在题目给的前提下我们总是能倒出合理的解。但是HDU1415也是同样的一个题目,不过那边没有SPEAIL JUDGE 所以这样做就是错误的。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,d,i,ca,cb,temp;
char a[2]={'A','B'},b[2]={'B','A'};
int main(){
while(scanf("%d %d %d",&n,&m,&d)!=EOF) {
n<m?(i=0):(i=1,temp=n,n=m,m=temp);
ca=cb=0;
while(cb!=d){
if(!ca){
cout<<"fill "<<a[i]<<endl,ca=n;
}
cout<<"pour "<<a[i]<<" "<<b[i]<<endl;
if(ca+cb>m)
ca-=(m-cb),cb=m;
else cb+=ca,ca=0;
if(cb==d) break;
if(cb==m)
cb=0,cout<<"empty "<<b[i]<<endl;
}
cout<<"success"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: