ZCMU - 1978: 调酒壶里的酸奶

简介: ZCMU - 1978: 调酒壶里的酸奶

题目链接:点击打开链接


题目大意:略。

解题思路:记忆化搜索,对每个状态都有六种情况:

  1. 把A倒满
  2. 把B倒满
  3. 把A倒光
  4. 把B倒光
  5. 把A倒进B
  6. 把B倒进A

六个情况直接搜索就可以了...当然dfs是会超时的,需要用记忆化搜索。


AC 代码


#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
queue<pii> q;
int a,b,c;
int vis[110][110], dis[110][110];
void init()
{
    while(!q.empty()) q.pop();
    mem(vis,0); mem(dis,0);
}
int bfs()
{
    dis[0][0]=0; vis[0][0]=1;
    q.push(make_pair(0,0));
    int x,y,A,B;
    while(!q.empty())
    {
        x=q.front().first, y=q.front().second; q.pop();
        for(int i=1;i<=6;i++)
        {
            if(i==1) A=a, B=y;
            else if(i==2) A=x, B=b;
            else if(i==3) A=0, B=y;
            else if(i==4) A=x, B=0;
            else if(i==5) A=x+y>=b?x+y-b:0, B=x+y>=b?b:x+y;
            else if(i==6) B=x+y>=a?x+y-a:0, A=x+y>=a?a:x+y;
            if(!vis[A][B])
            {
                vis[A][B]=1;
                dis[A][B]=1+dis[x][y];
                if(A==c || B==c) return dis[A][B];
                q.push(make_pair(A,B));
            }
        }
    }
    return 0;
}
int main()
{
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        init();
        int rs=bfs();
        if(rs) printf("%d\n",rs);
        else puts("impossible");
    }
    return 0;
}
目录
相关文章
|
7月前
|
编译器 C语言
成功解决“函数用于调用的参数太少/太多”问题
成功解决“函数用于调用的参数太少/太多”问题
266 0
|
7月前
|
安全 C语言 C++
奇怪的函数调用
奇怪的函数调用
62 0
|
存储
最粗暴的方法实现一个栈
最粗暴的方法实现一个栈
49 1
|
4月前
|
存储
hyengine 寄存器问题之传递参数和接收返回值如何解决
hyengine 寄存器问题之传递参数和接收返回值如何解决
|
7月前
|
存储 Java 编译器
一看就会的Java方法
一看就会的Java方法
普通函数中的this指向问题解决方案箭头函数
普通函数中的this指向问题解决方案箭头函数
46 0
我程序会死在这一行,是什么原因?
我程序会死在这一行,是什么原因?
|
前端开发
前端异步请求逐步进行一回调
前端异步请求逐步进行一回调
56 0
|
NoSQL JavaScript 算法
调用第三方接口遇到的 13 大坑
调用第三方接口遇到的 13 大坑
|
人工智能 达摩院 前端开发
想爱的人,想去的地方,一秒钟都不想等了!
万物复苏,终于复工。上周,橙子在内网上向阿里同学发起提问:2020我们拥抱变变变化,但无论发生什么2020你都想「做成」的事是什么?
296 0
想爱的人,想去的地方,一秒钟都不想等了!