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 |
代码很赞,学习了~In Reply To:一次AC了,花了4,5个小时在想回溯的问题 Posted by:zpdlut at 2010-08-10 14:58:16 > #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