您的位置:首页 > 其它

HDU1495 非常可乐【倒水问题+BFS】

2018-03-22 21:38 453 查看
由于没有刻度,所以只能是倒完或者说是将所倒的那个容器倒满,所以说得分6种情况考虑,每种情况还要再细分两种情况考虑。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;

int s,n,m;

struct node
{
int s;
int n;
int m;
int step;
}first;

bool book[101][101][101];

int bfs()
{
int s2;
if(s%2!=0)
return -1;
s2=s/2;
queue<node> q;
first.s=s;
first.n=0;
first.m=0;
first.step=0;
q.push(first);
book[s][0][0]=true;
while(!q.empty())
{
node t=q.front();
q.pop();
if((t.m==s2&&t.n==s2)||(t.m==s2&&t.s==s2)||(t.n==s2&&t.s==s2))
return t.step;
node v;
//s-->n;
if(t.s&&n-t.n>0)
{
if(t.s&
4000
gt;n-t.n)
{
v.s=t.s-(n-t.n);
v.n=n;
v.m=t.m;
}
else
{
v.s=0;
v.n=t.n+t.s;
v.m=t.m;
}
if(!book[v.s][v.n][v.m])
{
v.step=t.step+1;
book[v.s][v.n][v.m]=true;
q.push(v);
}
}
//s-->m;
if(t.s&&m-t.m>0)
{
if(t.s>m-t.m)
{
v.s=t.s-(m-t.m);
v.m=m;
v.n=t.n;
}
else
{
v.s=0;
v.m=t.m+t.s;
v.n=t.n;
}
if(!book[v.s][v.n][v.m])
{
book[v.s][v.n][v.m]=true;
v.step=t.step+1;
q.push(v);
}
}
//n-->s
if(t.n&&s-t.s>0)
{
if(t.n>s-t.s)
{
v.n=t.n-(s-t.s);
v.s=s;
v.m=t.m;
}
else
{
v.n=0;
v.s=t.n+t.s;
v.m=t.m;
}
if(!book[v.s][v.n][v.m])
{
book[v.s][v.n][v.m]=true;
v.step=t.step+1;
q.push(v);
}
}
//n-->m
if(t.n&&m-t.m>0)
{
if(t.n>m-t.m)
{
v.n=t.n-(m-t.m);
v.m=m;
v.s=t.s;
}
else
{
v.n=0;
v.m=t.n+t.m;
v.s=t.s;
}
if(!book[v.s][v.n][v.m])
{
book[v.s][v.n][v.m]=true;
v.step=t.step+1;
q.push(v);
}
}
//m-->s
if(t.m&&(s-t.s>0))
{
if(t.m>s-t.s)
{
v.m=t.m-(s-t.s);
v.s=s;
v.n=t.n;
}
else
{
v.m=0;
v.s=t.m+t.s;
v.n=t.n;
}
if(!book[v.s][v.n][v.m])
{
book[v.s][v.n][v.m]=true;
v.step=t.step+1;
q.push(v);
}
}
//m-->n
if(t.m&&n-t.n>0)
{
if(t.m>n-t.n)
{
v.m=t.m-(n-t.n);
v.n=n;
v.s=t.s;
}
else
{
v.m=0;
v.n=t.m+t.n;
v.s=t.s;
}
if(!book[v.s][v.n][v.m])
{
book[v.s][v.n][v.m]=true;
v.step=t.step+1;
q.push(v);
}
}
}
return -1;
}

int main()
{
ios::sync_with_stdio(false);cin.tie(0);

while(cin>>s>>n>>m&&(s||n||m))
{
memset(book,false,sizeof(book));
int mini=bfs();
if(mini==-1)
cout<<"NO"<<endl;
else
cout<<mini<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: