北大OJ3414
2015-12-08 20:38
435 查看
#include<iostream> #include<queue> using namespace std; int *tage; int *AdjVex; int *Number; int *operation; int BFS(int A,int B,int C) { if(C==0) return 0; int max=(A+1)*(B+1); tage=new int[max]; AdjVex=new int[max]; operation=new int[max]; Number=new int[max]; for(int i=0;i<max;i++) { tage[i]=0; AdjVex[i]=0; operation[i]=0; Number[i]=0; } int num[2]={A,B}; tage[0]=1; Number[0]=0; queue<int>Q; Q.push(0); while(!Q.empty()) { int u=Q.front(); Q.pop(); int v[2]; v[0]=u/(B+1); v[1]=u-v[0]*(B+1); int i; for(int j=0;j<6;j++) { switch(j) { case 0: i=num[0]*(B+1)+v[1]; break; case 1: i=v[0]*(B+1)+num[1]; break; case 2: i=v[1]; break; case 3: i=v[0]*(B+1); break; case 4: if(v[0]+v[1]<=num[0]) i=(v[0]+v[1])*(B+1); else i=num[0]*(B+1)+v[1]-(num[0]-v[0]); break; case 5: if(v[0]+v[1]<=num[1]) i=v[0]+v[1]; else i=(v[0]-(num[1]-v[1]))*(B+1)+num[1]; break; default: break; } if(tage[i]==0) { Number[i]=Number[u]+1; tage[i]=1; AdjVex[i]=u; operation[i]=j; if(i/(B+1)==C||(i%(B+1))==C) return i; Q.push(i); } } tage[u]=2; } return -1; } void print_path(int s,int v) { if(v==s) return; print_path(s,AdjVex[v]); switch(operation[v]) { case 0: cout << "FILL(1)"; break; case 1: cout << "FILL(2)"; break; case 2: cout << "DROP(1)"; break; case 3: cout << "DROP(2)"; break; case 4: cout << "POUR(2,1)"; break; case 5: cout << "POUR(1,2)"; break; default: break; } cout<<endl; } int main() { int A,B,C; cin>>A>>B>>C; int output=BFS(A,B,C); if(output!=-1) { cout<<Number[output]<<endl; print_path(0,output); } else cout<<"impossible"<<endl; return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例