标签:hdu 1495 非常可乐 bfs 搜索
7 4 3 4 1 3 0 0 0
NO 3
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define N 100010
#define Mod 10000007
#define lson l,mid,idx<<1
#define rson mid+1,r,idx<<1|1
#define lc idx<<1
#define rc idx<<1|1
const double EPS = 1e-11;
const double PI = acos ( -1.0 );
const double E = 2.718281828;
typedef long long ll;
const int INF = 1000010;
using namespace std;
int s,n,m;
bool vis[111][111][111],flag;
struct node
{
int s,n,m;
int num;
};
queue<node>que;
void bfs()
{
while(que.size())
que.pop();
memset(vis,0,sizeof vis);
node a,t;
a.s=s,a.n=0,a.m=0,a.num=0;
que.push(a);
vis[s][0][0]=1;
while(que.size())
{
a=que.front();
que.pop();
if(a.s==a.n&&a.m==0||(a.s==0&&a.n==a.m)||(a.n==0&&a.s==a.m))
{
flag=0;
cout<<a.num<<endl;
return;
}
if(a.s>0)//s->n,s->m
{
if(a.n<n)//s->n
{
int tt=n-a.n;
if(a.s>tt)//n可以倒满
{
t.s=a.s-tt;
t.n=n;
t.m=a.m;
}
else//不可以倒满
{
t.s=0;
t.n=a.s+a.n;
t.m=a.m;
}
if(!vis[t.s][t.n][t.m])
{
t.num=a.num+1;
que.push(t);
vis[t.s][t.n][t.m]=1;
}
}
if(a.m<m)
{
int tt=m-a.m;
if(a.s>tt)
{
t.s=a.s-tt;
t.n=a.n;
t.m=m;
}
else
{
t.s=0;
t.n=a.n;
t.m=a.m+a.s;
}
if(!vis[t.s][t.n][t.m])
{
t.num=a.num+1;
que.push(t);
vis[t.s][t.n][t.m]=1;
}
}
}
if(a.n>0)
{
if(a.s<s)
{
int tt=s-a.s;
if(a.n>tt)
{
t.n=a.n-tt;
t.m=a.m;
t.s=s;
}
else
{
t.n=0;
t.m=a.m;
t.s=a.s+a.n;
}
if(!vis[t.s][t.n][t.m])
{
t.num=a.num+1;
que.push(t);
vis[t.s][t.n][t.m]=1;
}
}
if(a.m<m)
{
int tt=m-a.m;
if(a.n>tt)
{
t.n=a.n-tt;
t.m=m;
t.s=a.s;
}
else
{
t.n=0;
t.m=a.m+a.n;
t.s=a.s;
}
if(!vis[t.s][t.n][t.m])
{
t.num=a.num+1;
que.push(t);
vis[t.s][t.n][t.m]=1;
}
}
}
if(a.m>0)
{
if(a.s<s)
{
int tt=s-a.s;
if(a.m>tt)
{
t.n=a.n;
t.m=a.m-tt;
t.s=s;
}
else
{
t.n=a.n;
t.m=0;
t.s=a.s+a.m;
}
if(!vis[t.s][t.n][t.m])
{
t.num=a.num+1;
que.push(t);
vis[t.s][t.n][t.m]=1;
}
}
if(a.n<n)
{
int tt=n-a.n;
if(a.m>tt)
{
t.n=n;
t.m=a.m-tt;
t.s=a.s;
}
else
{
t.n=a.n+a.m;
t.m=0;
t.s=a.s;
}
if(!vis[t.s][t.n][t.m])
{
t.num=a.num+1;
que.push(t);
vis[t.s][t.n][t.m]=1;
}
}
}
}
}
int main()
{
while(cin>>s>>n>>m&&(s+n+m))
{
if(s%2)//奇数不能平分
{
cout<<"NO\n";
continue;
}
flag=1;
bfs();
if(flag)
cout<<"NO"<<endl;
}
return 0;
}
标签:hdu 1495 非常可乐 bfs 搜索
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/42362013