zoukankan      html  css  js  c++  java
  • 【CODEVS】倒水问题


    题目描述:

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

    输入描述:

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

    输出描述:

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

    样例输入:

    3 22 1

    样例输出:

    14


    直接暴力掉。x倒入y中、y倒入z中、x倒空、z倒空、x倒满、y倒满六种大情况。

    #include<cstdio>
    #include<iostream>
    #include<queue>
    using namespace std;
    int x,y,z;
    
    bool book[20000][20000];
    
    struct v
    {
    	int a,b,step;
    	bool operator()()
    	{
    		return a==z || b==z;
    	}
    	v(int c,int d,int e):a(c),b(d),step(e){};
    };
    queue<v> q;
    
    bool bfs()
    {
    	v temp(0,0,0);
    	q.push(temp);
    	while(!q.empty())
    	{
    		int a,b,step;
    		temp=q.front();
    		q.pop();
    		if(temp())
    		{
    			cout<<temp.step;
    			return true;
    		}
    		a=temp.a;
    		b=temp.b;
    		step=temp.step;
    		for(int i=0;i<6;i++)
    		{
    			int q1,q2,q3;
    			if(i==0&&a!=x)q1=x,q2=b,q3=step+1;
    			else if(i==1&&b!=y)q1=a,q2=y,q3=step+1;
    			else if(i==2&&b<y&&a>0){
    				if(b+a>y) q1=a-y+b,q2=y,q3=step+1;
    				else  q1=0,q2=b+a,q3=step+1;
    			}
    			else if(i==3&&a<x&&b>0){
    				if(a+b>x) q1=x,q2=b-x+a,q3=step+1;
    				else	  q1=b+a,q2=0,q3=step+1;
    			}
    			else if(i==4&&a>0) q1=0,q2=b,q3=step+1;
    			else if(i==5&&b>0) q1=a,q2=0,q3=step+1;	
    			if(!book[q1][q2])
    			{
    				q.push(v(q1,q2,q3));
    				book[q1][q2]=true;
    			}
    		}
    	}
    	return false;
    }
    int main()
    {
    	cin>>x>>y>>z;
    	if(!bfs())
    		cout<<"impossible";
    	return 0;
    }




  • 相关阅读:
    C++ 获取ms级的计时
    基于UDP的IP对IP的客户端程序
    stm32 keil生成bin文件
    xmos 加密
    DMX512程序介绍
    WS2812原理及实现
    MFC 通过按钮调用自对话框 给按钮加载位图 给对话框添加背景
    4*4矩阵键盘FPGA扫描实现
    FIFO
    Modelsim建立UVM环境
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6537767.html
Copyright © 2011-2022 走看看