您的位置:首页 > 其它

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