Codevs 1226 倒水问题 题解



1226 倒水问题

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold


题目描述 Description

有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来。

输入描述 Input Description

一行,三个数据,分别表示 x,y 和 z;

输出描述 Output Description

一行,输出最小步数 ,如果无法达到目标,则输出"impossible"

样例输入 Sample Input

3 22 1


样例输出 Sample Output

14


<span style="font-family:Comic Sans MS;">#include<iostream>
#include<cstdio>
#include<cstring> 
#include<queue>
#include<cmath>
using namespace std;

struct zt
	{
	int x,y,d;
	}z;
bool vis[110][110];
int a,b,c,d,x,y,z1,e;
queue<struct zt>q;



int main()
{	
    cin>>x>>y>>z1;
    memset(vis,0,sizeof(vis));
    q.push({0,0,0});
    vis[0][0]=1;
	while(!q.empty())
		{
	    
		z=q.front();
				
		if((z.x==z1)||(z.y==z1))
			{
			z1=0;
			cout<<z.d;
			break;	
			}
 		if(!vis[0][z.y])        //x空 	
		 	{
		 	z.d++;
 			z.x=0;
			q.push(z);
			vis[0][z.y]=1;//cout<<1<<','<<z.x<<' '<<z.y<<' '<<z.d <<endl;	
			}
			
		z=q.front(); 			//y空
 		if(!vis[z.x][0])	
		 	{
 			z.d++;
			z.y=0;
			q.push(z);
			vis[z.x][0]=1;//cout<<2<<','<<z.x<<' '<<z.y<<' '<<z.d <<endl;	
			}
			
			z=q.front();		//x满 
 		if(!vis[x][z.y])	
		 	{
		 	z.d++;
 			z.x=x;
			q.push(z);
			vis[x][z.y]=1;//cout<<3<<','<<z.x<<' '<<z.y<<' '<<z.d <<endl;	
			}
			
		z=q.front();        	//y满 
 		if(!vis[z.x][y])	
		 	{
		 	z.d++;
 			z.y=y;
			q.push(z);
			vis[z.x][y]=1;//cout<<4<<','<<z.x<<' '<<z.y<<' '<<z.d <<endl;	
			}
			
		z=q.front();
		int mi;
		mi=min(z.y,x-z.x);			//y倒x 
		if(!vis[z.x+mi][z.y-mi])//if(!vis[(z.x+z.y)%x][z.x+z.y-(z.x+z.y)%x])
			{
			
			
			z.d++;
			e=z.x;
 			z.x=z.x+mi;
			z.y=z.y-mi;
			q.push(z);
			vis[z.x][z.y]=1;//cout<<5<<','<<z.x<<' '<<z.y<<' '<<z.d <<endl;	
			}
			
		z=q.front();
	
		mi=min(z.x,y-z.y);			//x倒y 
		if(!vis[z.x-mi][z.y+mi])//if(!vis[z.x+z.y-(z.x+z.y)%y][(z.x+z.y)%y])
			{
			z.d++;
 			e=z.y;
			z.x=z.x-mi;//z.y=(z.x+z.y)%y;
			z.y=z.y+mi;//z.x=z.x+e-(z.x+e)%y;
			q.push(z);
			vis[z.x][z.y]=1;//cout<<6<<','<<z.x<<' '<<z.y<<' '<<z.d <<endl;	
			}
		
		q.pop();	        //删队头 
		
		}
	if(z1)cout<<"impossible";   
	
}
</span>


测试通过 Accepted

总耗时:  2 ms
0 /  0 数据通过测试.
运行结果
测试点#1.in  结果:AC    内存使用量:  256kB     时间使用量:  0ms     
测试点#2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
测试点#3.in 结果:AC 内存使用量: 128kB 时间使用量: 1ms
测试点#4.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
测试点#5.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms

基础知识

队列的stl
q.push();     //入队
q.front();   //取队首
q.pop();      //弹队首
q.empty(); //判队空 空返回true







你可能感兴趣的:(搜索,codevs,提高组)