ZOJ 1005 Jugs
2011-05-25 18:26
316 查看
第一种给出的是一种搜索算法,时间复杂度可能会比较高,但是比较容易理解
就是通过标记记录走过的点,我们在这里标的使A瓶和B瓶的含水量。然后通过队列寻找下一个更新的点,直到找到它。
第二种算法给出的是一个以倒水问题为基础的数学方法,指的是拿一个较小的瓶子一直往大的里面倒,当大瓶满的时候就倒空,当小瓶没有水的时候就加满,以为给出的数据A B是互素的,所以在题目给的前提下我们总是能倒出合理的解。但是HDU1415也是同样的一个题目,不过那边没有SPEAIL JUDGE 所以这样做就是错误的。
就是通过标记记录走过的点,我们在这里标的使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; }
相关文章推荐
- ZOJ 1005 Jugs
- ZOJ 1005 Jugs
- zoj 1005Jugs
- ZOJ-1005-Jugs
- zoj 1005Jugs
- zoj 1005 Jugs
- ZOJ1005-Jugs
- ZOJ 1005 Jugs
- ZOJ--1005:Jugs(dfs)
- zoj 1005 Jugs
- 浙大ZOJ 1005 Jugs问题解决
- ZOJ 1005 Jugs 杯子倒水问题
- 模拟 zoj 1005 Jugs
- ZOJ1005 Jugs
- zoj1005 Jugs
- ZOJ1005 Jugs
- ZOJ 1005 Jugs
- bfs ZOJ 1005 Jugs
- ZOJ 1005 Jugs (DFS)
- zoj 1005 Jugs(数学做法,还可以用BFS(我不会))