您的位置:首页 > 其它

倒水算法

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: