hdu 1495 非常可乐

 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1495   

  就是分别对6种装载状态进行BFS。

  在处理细节方面比较繁琐。

  下面是AC代买:

#include<iostream>
#include<queue>
#include<cstring>
#define N 105
using namespace std;
bool flag;
int s,n,m;
struct point
{
	int x,y,z;
	int step;
};
bool visited[N][N][N];
point s_pos;
int ok(point t)         //结束状态
{   
	if((t.x==t.y&&t.z==0)||(t.x==t.z&&t.y==0)||(t.y==t.z&&t.x==0))
		return 1;
	return 0;
}
void bfs()
{
	memset(visited,0,sizeof(visited));
	visited[s][0][0]=1;
	s_pos.x=s;   s_pos.y=0;  s_pos.z=0; s_pos.step=0;
	queue<point>Q;
	Q.push(s_pos);
	
	while(!Q.empty())
	{
		point p;
		int t;
		
		point temp=Q.front();
		Q.pop();
		if(ok(temp))
		{
			flag=1;
			cout<<temp.step<<endl;
			return ;
		}
		if(temp.x>0)
		{
			if(temp.y<n)
			{
				t=n-temp.y;
				p.z=temp.z;
				p.step=temp.step+1;
				if(temp.x>t)
				{	p.x=temp.x-t;	p.y=n;	}
				else
				{   p.x=0;  	p.y=temp.y+temp.x; }
				if(!visited[p.x][p.y][p.z])
				{
					visited[p.x][p.y][p.z]=1;
					Q.push(p);                                     //x->y
				}
			}
			if(temp.z<m)
			{
				
				t=m-temp.z;
				p.y=temp.y;
				
				if(temp.x>t)
				{	p.x=temp.x-t;	p.z=m;p.step=temp.step+1;	}
				else
				{	p.x=0;	p.z=temp.z+temp.x;	p.step=temp.step+1;	}
				if(!visited[p.x][p.y][p.z])
				{
					visited[p.x][p.y][p.z]=1;
					Q.push(p);                                     
				}         //x->z
			}
			
		}
		if(temp.y>0)
		{
			if(temp.x<s)
			{
				t=s-temp.x;	
				p.z=temp.z;
				if(temp.y>t)
				{	p.y=temp.y-t;	p.x=s;		p.step=temp.step+1;		}
				else
				{   p.y=0;  	p.x=temp.y+temp.x;  p.step=temp.step+1;	}
				if(!visited[p.x][p.y][p.z])
				{
					visited[p.x][p.y][p.z]=1;
					Q.push(p);                                     
				}                               //y->x
			}
			if(temp.z<m)
			{
				
				t=m-temp.z;
				p.x=temp.x;
				
				if(temp.y>t)
				{	p.y=temp.y-t;	p.z=m;p.step=temp.step+1;	}
				else
				{	p.y=0;	p.z=temp.z+temp.y;	p.step=temp.step+1;	}
				if(!visited[p.x][p.y][p.z])
				{
					visited[p.x][p.y][p.z]=1;
					Q.push(p);                                     
				}                              //y->z
			}
			
		}
		if(temp.z>0)
		{
			if(temp.x<s)
			{
				t=s-temp.x;
				p.y=temp.y;
				if(temp.z>t)
				{	p.z=temp.z-t; p.x=s;p.step=temp.step+1;     }           
				else
				{   p.z=0;    p.x=temp.z+temp.x;p.step=temp.step+1;  }
				if(!visited[p.x][p.y][p.z])
				{
					visited[p.x][p.y][p.z]=1;
					Q.push(p);                                     
				}                               //z->x
			}
			if(temp.y<n)
			{
				
				t=n-temp.y;
				p.x=temp.x;
				if(temp.z>t)
				{   p.z=temp.z-t;  p.y=n;p.step=temp.step+1;     }
				else
				{   p.z=0;   p.y=temp.z+temp.y;   p.step=temp.step+1;}   
				if(!visited[p.x][p.y][p.z])
				{
					visited[p.x][p.y][p.z]=1;
					Q.push(p);                                     
				}                            //z->y
			}
		}
		
	}
	
	
}
int main()
{
	while(cin>>s>>n>>m,s+n+m)
	{
		flag=0;
		bfs();
		if(!flag)
			cout<<"NO"<<endl;
	}
	return 0;
}


 

你可能感兴趣的:(hdu 1495 非常可乐)