Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
一次AC了,花了4,5个小时在想回溯的问题#include<iostream> #include<stack> #include<queue> using namespace std; struct cup { int x,y; int step; int flag; cup * pre; }; queue<cup> Q; stack<int> T; int a,b,z; int visited[101][101]={0}; int result; void BFS(int x,int y) { visited[x][y] = 1; cup c; c.x=0; c.y=0; c.flag = 0; c.pre = NULL; c.step = 0; Q.push(c); cup temp[300]; int count=-1; while(!Q.empty()) { count++; temp[count] = Q.front(); Q.pop(); for(int i=1;i<=6;i++) { switch(i) { case 1: c.x = a; //fill a c.y = temp[count].y; c.flag = 1; break; case 2: //fill b c.x = temp[count].x; c.y = b; c.flag = 2; break; case 3: //drop a c.x = 0; c.y = temp[count].y; c.flag = 3; break; case 4: //drop b c.x = temp[count].x; c.y = 0; c.flag = 4; break; case 5: //pour a to b if(temp[count].x>b-temp[count].y) { c.x = temp[count].x -(b-temp[count].y); c.y = b; } else { c.x = 0; c.y = temp[count].y+temp[count].x; } c.flag = 5; break; case 6: //pour b to a if(temp[count].y > a- temp[count].x) { c.y = temp[count].y - (a-temp[count].x); c.x = a; } else { c.x =temp[count].y + temp[count].x; c.y = 0; } c.flag = 6; break; } if(visited[c.x][c.y]) continue; visited[c.x][c.y] = 1; c.step = temp[count].step + 1; c.pre = &temp[count]; if(c.x==z||c.y == z) { result = c.step; while(c.pre) { T.push(c.flag); c = *c.pre; } return; } Q.push(c); } } } int main() { cin>>a>>b>>z; BFS(0,0); if(result == 0) cout<<"impossible"<<endl; else { cout<<result<<endl; while(!T.empty()){ int i = T.top(); T.pop(); switch(i) { case 1:cout<<"FILL(1)"<<endl;break; case 2:cout<<"FILL(2)"<<endl;break; case 3:cout<<"DROP(1)"<<endl;break; case 4:cout<<"DROP(2)"<<endl;break; case 5:cout<<"POUR(1,2)"<<endl;break; case 6:cout<<"POUR(2,1)"<<endl;break; } } } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator