感想:这是我的第一道oj题,思路我想了很久,感觉建模能力还是不够强啊,理清楚了就好,把各个操作看成一条路,BFS就好
http://acm.zju.edu.cn/onlinejudge/showPRoblem.do?problemCode=1005
#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<stack>#include<map>#include<vector>#include<deque>using namespace std;string s[7]={"fill A","fill B","empty A","empty B","pour A B","pour B A","success"}; vector<string> t;struct jugs { int AT; int BT;}; deque<jugs> de;int A,B,N;int main(){ while(scanf("%d %d %d",&A,&B,&N)!=EOF){ int *isread=new int[(A+2)*(B+2)]; int *a=new int[(A+2)*(B+2)]; int *c=new int[(A+2)*(B+2)]; jugs em,temp1,temp2; em.AT=0; em.BT=0; isread[0*B+0]=1; de.clear(); de.push_back(em); while(!de.empty()){ temp1=de.front(); de.pop_front(); if(isread[A*(B+1)+temp1.BT]==0){ temp2=temp1; temp2.AT=A; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=0; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(isread[temp1.AT*(B+1)+B]==0){ temp2=temp1; temp2.BT=B; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=1; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(isread[temp1.AT+temp1.BT]==0&&temp1.AT+temp1.BT<=B){ temp2.AT=0; temp2.BT=temp1.AT+temp1.BT; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=4; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(temp1.AT+temp1.BT>B&&isread[(temp1.AT-B+temp1.BT)*(B+1)+B]==0){ temp2.AT=temp1.AT-B+temp1.BT; temp2.BT=B; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=4; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(temp1.AT+temp1.BT>A&&isread[A*(B+1)+(temp1.BT-A+temp1.AT)]==0){ temp2.AT=A; temp2.BT=temp1.BT-A+temp1.AT; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=5; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(isread[(temp1.AT+temp1.BT)*(B+1)]==0&&temp1.AT+temp1.BT<=A){ temp2.BT=0; temp2.AT=temp1.AT+temp1.BT; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=5; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(isread[temp1.BT]==0){ temp2.AT=0; temp2.BT=temp1.BT; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=2; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } if(isread[temp1.AT*(B+1)]==0){ temp2.BT=0; temp2.AT=temp1.AT; a[temp2.AT*(B+1)+temp2.BT]=temp1.AT*(B+1)+temp1.BT; c[temp2.AT*(B+1)+temp2.BT]=3; if(temp2.BT==N) break; de.push_back(temp2); isread[temp2.AT*(B+1)+temp2.BT]=1; } } int tt=temp2.AT*(B+1)+temp2.BT; t.clear(); while(tt!=0){ t.push_back(s[c[tt]]); tt=a[tt]; } for(int i=t.size()-1;i>=0;i--){ cout<<t[i]<<endl; } cout<<"success"<<endl; }}
新闻热点
疑难解答