倒水算法
2016-06-07 15:33
323 查看
#include <iostream> #include <fstream> #include <stdlib.h> #include <vector> #include <set> #define MAX 1005 using namespace std; int src[MAX]; int des[MAX]; int cur[MAX]; int n; struct Node { int id; vector<int> current; int step; int father; }; vector< pair<int, int > > works; vector< pair<int ,int > > makeWorks(){ vector< pair<int ,int > > ws; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i!=j) ws.push_back(pair<int, int>(i,j)); return ws; } struct State { vector<int> s; State(vector<int>x){ s=x; } friend bool operator < (State a,State b){ for(int i=0;i<a.s.size()&&i<b.s.size();i++) if(a.s[i]<b.s[i]) return true; return false; } void print(){ cout<<"states:"; for(int i=0;i<s.size();i++) cout<<s[i]<<" "; cout<<endl; } }; set<State> states; State makeState(int s[],int le){ vector<int>v; for(int i=0;i<le;i++) v.push_back(s[i]); State st(v); return st; } bool findState(State s){ set<State>::iterator it=states.find(s); return it!=states.end(); } void addState(State s){ states.insert(s); // s.print(); } vector<Node> v; void input() { for(int i=0;i<n;i++) cin>>src[i]; for(int i=0;i<n;i++) cin>>des[i]; for(int i=0;i<n;i++) cin>>cur[i]; } vector<int> currents(){ vector<int>c; for(int i=0;i<n;i++) c.push_back(cur[i]); return c; } bool success(Node node) { for(int i=0;i<n;i++){ if(node.current[i]!=des[i]) return false; } for(int i=0;i<n;i++) cout<<node.current[i]<<" "; return true; } bool bfs() { int front=0,rear=0; states.clear(); Node temp={0,currents(),0,-1}; State tstate=State(temp.current); addState(tstate); v.push_back(temp); rear++; int index=0; while(front<rear) { index++; temp=v[front++]; if(success(temp)){ return true; } for(int i=0;i<works.size();i++) { Node temp1=temp; temp1.step++; temp1.father=temp.step; int s=works[i].first,d=works[i].second; int ab=src[d]-temp1.current[d]; if(ab==0||temp1.current[s]==0){ continue; }else if(temp1.current[s]<=ab){ temp1.current[d]+=temp1.current[s]; temp1.current[s]=0; }else { temp1.current[s]-=ab; temp1.current[d]=src[d]; } State cs(temp1.current); if(!findState(cs)){ temp1.id=v.size()-1; v.push_back(temp1); rear++; addState(cs); } } } return false; } void out(int id){ if(id){ out(v[id].father); } for(int i=0;i<v[id].current.size();i++) cout<<v[id].current[i]<<" "; cout<<endl; } void outAnswer(bool a) { if(!a){ cout<<"not"<<endl; return ; } cout<<"sum:"<<v.back().step<<endl; out(v.size()-1); for(int i=0;i<n;i++) cout<<des[i]<<" "; cout<<endl; } /* 3 6 3 1 4 1 1 6 0 0 */ int main() { cin>>n; input(); works=makeWorks(); bool ans=bfs(); outAnswer(ans); return 0; }
相关文章推荐
- 关于驱动和设备的相关的注册表键的位置,和相关信息
- tcp/udp高并发和高吐吞性能测试工具
- QEMU 使用的镜像文件:qcow2 与 raw
- 【POJ】:POJ 3984
- leetcode:sort-list
- 《21天学通C++》_5 2016.5.25
- 【Xibo】Xibo汉化指南
- 图像配准中的变换操作
- Chains (链 )
- 性能测试
- CentOS使用EPEL YUM源教程
- Linux之文件系统的开机挂载
- 水晶报表VS2008使用
- http://mp.weixin.qq.com/s?__biz=MzAwODMyNjYxMQ==&mid=502716191&idx=1&sn=e916fa1a45fe91d162e1e71a2689
- python 高阶函数(二)
- Linux 内核 list_head 学习(二)
- JSON.stringify 语法实例讲解
- iOS开发-玩玩渐变导航栏
- 利息计算公式
- Linked List Cycle II