#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;
}
倒水算法
最新推荐文章于 2022-07-05 13:19:48 发布