您的位置:首页 > 其它

hdu 1495 非常可乐

2015-09-16 20:16 218 查看
题目大意:中文题- -

解题思路:跟poj3414类似,题目本身不难,只是需要列举的状态比较多,用bfs,把情况列举出来就行了。

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495

代码:

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
int m,n,s;
struct node
{
int x,y,all,step;
};
int vis[101][101][101];
int bfs()
{   memset(vis,0,sizeof(vis));
node p;
p.x=0;
p.y=0;
p.all=s;
p.step=0;
queue<node>q;
q.push(p);
vis[s][0][0]=1;

while(!q.empty())
{
p=q.front();
q.pop();
if((p.x==p.y&&p.all==0)||(p.x==p.all&&p.y==0)||(p.all==p.y&&p.x==0))
return p.step;
node tmp;
if(p.all!=0)//s->n or m;
{
if(p.x<n)
{
int minn=min(p.all,n-p.x);
tmp=p;
tmp.x+=minn;
tmp.all-=minn;
tmp.step=p.step+1;
if(!vis[tmp.all][tmp.x][tmp.y])
{
vis[tmp.all][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
if(p.y<m)
{
int minn=min(p.all,m-p.y);
tmp=p;
tmp.y+=minn;
tmp.all-=minn;
tmp.step=p.step+1;
if(!vis[tmp.all][tmp.x][tmp.y])
{
vis[tmp.all][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
}
if(p.x!=0)//n->s or m
{
if(p.all<s)
{
tmp=p;
int minn=min(p.x,s-p.all);
tmp.x-=minn;
tmp.all+=minn;
tmp.step=p.step+1;
if(!vis[tmp.all][tmp.x][tmp.y])
{
vis[tmp.all][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
if(p.y<m)
{
tmp=p;
int minn=min(p.x,m-p.y);
tmp.x-=minn;
tmp.y+=minn;
tmp.step=p.step+1;
if(!vis[tmp.all][tmp.x][tmp.y])
{
vis[tmp.all][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
}
if(p.y!=0) //m->s or n
{
if(p.all<s)
{
tmp=p;
int minn=min(p.y,s-p.all);
tmp.all+=minn;
tmp.y-=minn;
tmp.step=p.step+1;
if(!vis[tmp.all][tmp.x][tmp.y])
{
vis[tmp.all][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
if(p.x<n)
{
tmp=p;
int minn=min(p.y,n-p.x);
tmp.x+=minn;
tmp.y-=minn;
tmp.step=p.step+1;
if(!vis[tmp.all][tmp.x][tmp.y])
{
vis[tmp.all][tmp.x][tmp.y]=1;
q.push(tmp);
}
}
}
}
return -1;
}
int main()
{
while(cin>>s>>n>>m)
{int ans=bfs();
if(s==0&&n==0&&m==0) break;
if(s%2) cout<<"NO"<<endl;

else  if(ans!=-1) cout<<ans<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: