pku 3414 pots

2023-10-30 10:49
文章标签 pku 3414 pots

本文主要是介绍pku 3414 pots,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3414 Pots 经典倒水问题,要求最短,宽搜,ax + by = c 有

解条件
c = 0 (mod gcd(a,b))

#include  < iostream >
#define  MAX_LEN 10001

using   namespace  std;

int  a,b,c;

bool  black[ 101 ][ 101 ] = {false} ;

struct  Node
{
    
int a,b;
    
int level;
    
int prev;
    
char s;
}
;

Node que[MAX_LEN];
int  top = 0 ,end = 0 ;

inline 
void  pour( int &  c, int &  d, int  vol)
{
    
if (c+> vol)
    
{
        c 
-= vol-d;
        d 
= vol;
    }

    
else
    
{
        d 
+= c;
        c 
=0;
    }

}


bool  expand()
{
    
//fill
    Node tmp = que[top];
    
if (tmp.a !=&& black[a][tmp.b] ==false)
    
{
        tmp.a 
= a;
        
++tmp.level;
        tmp.s 
= 'f';
        tmp.prev 
= top;
        black[tmp.a][tmp.b] 
= true;
        que[end
++= tmp;
    }


    tmp 
= que[top];
    
if (tmp.b != b && black[tmp.a][b] ==false)
    
{
        tmp.b 
= b;
        
++tmp.level;
        tmp.s 
= 'f';
        tmp.prev 
= top;
        black[tmp.a][tmp.b] 
= true;
        que[end
++= tmp;
    }


    
//drop
    tmp = que[top];
    
if (tmp.a != 0 && black[0][tmp.b] ==false)
    
{
        tmp.a 
= 0;
        
++tmp.level;
        tmp.s 
= 'd';
        tmp.prev 
= top;
        black[
0][tmp.b] = true;
        que[end
++= tmp;
    }


    tmp 
= que[top];
    
if (tmp.b != 0 && black[tmp.a][0]==false)
    
{
        tmp.b 
= 0;
        
++tmp.level;
        tmp.s 
= 'd';
        tmp.prev 
= top;
        black[tmp.a][
0= true;
        que[end
++= tmp;
    }

    
// pour 1 -> 2
    tmp = que[top];
    
if (tmp.a != 0 && tmp.b!=b)
    
{
        pour(tmp.a, tmp.b,b);
        
if (!black[tmp.a][tmp.b])
        
{
            
++tmp.level;
            tmp.s 
= 'p';
            tmp.prev 
= top;
            black[tmp.a][tmp.b] 
= true;
            que[end
++= tmp;
            
if (tmp.a == c || tmp.b == c)
                
return false;
        }

    }

    
// pour 2 -> 1
    tmp = que[top];
    
if (tmp.b != 0 && tmp.a!=a)
    
{
        pour(tmp.b, tmp.a,a);
        
if (!black[tmp.a][tmp.b])
        
{
            
++tmp.level;
            tmp.prev 
= top;
            tmp.s 
= 'p';
            black[tmp.a][tmp.b] 
= true;
            que[end
++= tmp;
            
if (tmp.a == c || tmp.b == c)
                
return false;
        }

    }

    
++top;
    
return true;
}


void  print( int  idx)
{
    
if (idx == 0return;
    
int ti = que[idx].prev;
    print(ti);
    
if (que[idx].s == 'f')
    
{
        
if (que[ti].a !=&& que[idx].a ==a)
            cout
<<"FILL(1)"<<endl;
        
else
            cout
<<"FILL(2)"<<endl;
    }

    
else if (que[idx].s == 'd')
    
{
        
if (que[ti].a !=0 && que[idx].a ==0)
            cout
<<"DROP(1)"<<endl;
        
else
            cout
<<"DROP(2)"<<endl;
    }

    
else
    
{
        
if (que[ti].a > que[idx].a)
        
{
                cout
<<"POUR(1,2)"<<endl;
        }

        
else
        
{
                cout
<<"POUR(2,1)"<<endl;
        }


    }

}


bool  search()
{
    top 
= 0;
    que[
0].a = que[0].b = 0;
    que[
0].level = 0;
    black[
0][0]= true;
    end 
= 1;
    
while (top!= end && expand());
    
return top!=end;
}


int  main()
{
    cin
>>a>>b>>c;
    
    
if (a == c)
    
{
        cout
<<"1 FILL(1)"<<endl;
        
return 0;
    }

    
if (b == c)
    
{
        cout
<<"1 FILL(2)"<<endl;
        
return 0;
    }

    
if (search())
    
{
        cout
<<que[end-1].level<<endl;
        print(end
-1);
    }

    
else
    
{
        cout
<<"impossible"<<endl;
    }

    
return 0;
}


 

这篇关于pku 3414 pots的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/307389

相关文章

poj 3414 Pots 广度优先搜索

题目意思:给出两个杯子容积,初始都为空杯子,给出目标水量,可以执行一些操作,分别是倒空一个杯子,倒满一个杯子,和将一个杯子的水倒到另一个中,问得到目标水量要进行至少多少次以及每次都是什么 FILL(1)表示倒满1杯子,POUR(2,1)表示将2杯子里的水倒进1杯子中,DROP(1)表示倒空1杯子。 本体为广度优先生成树,每次对六种操作进行广度搜索,用二维数组进行状态是否出现过的标记,并记录

PKU Campus 2011 B A Problem about Tree lca倍增

B:A Problem about Tree 总时间限制:  1000ms  内存限制:  65536kB 描述 Given a tree with Nvertices and N- 1 edges, you are to answer Qqueries on "which vertex isY's parent if we choose Xas the ro

poj 3414 dfs 广度优先搜索

题意: 给定两个杯子的容量a,b和目标水量c 。 有六种操作: 1、倒满a杯子。   2、倒满b杯子。 3、将a杯子的水全部倒出。  4、将b杯子的水全部倒出。   5、将a杯子的水倒到b杯子,直到a杯子倒尽或b杯子倒满。 6、将b杯子的水倒到a杯子,直到b杯子倒尽活a杯子倒满。 求:最少进行多少次操作使a或b任意一杯子的水量恰好等于目标水量c,并输出倒水的过程。 题目链接:h

PKU Online Judge 1054

PKU Online Judge   /  练习 题目 排名 状态 提问 1054:Cube 查看提交统计提问 总时间限制:  1000ms  内存限制:  131072kB 描述 Delayyy君很喜欢玩某个由Picks编写的方块游戏,游戏在一个由单位格组成的棋盘上进行。 游戏的主角是一个6个面互不相同的小方块,每次可以向上下左右中的某个方

PKU Online Judge 1055:Tree

1055:Tree 查看提交统计提问 总时间限制:  2000ms  内存限制:  131072kB 描述 在信息学竞赛中,我们经常要遇到树这种结构。 一棵树中除根结点外有且仅有一个父亲,而可能有很多儿子。所以,当我们要生成一棵树的时候,我们通常使用以下算法: 对树中的每个点定义一个深度。第 1 个节点的深度为 1,第 i 个点的深度就是 Fatheri的

pku 1024

这是别人的代码,效率很高,在status上的第一页,看了人家的自己就不想写了,就写篇分析吧。。。 #include <iostream>const int gsize = 20 ; // 图的大小,实际上测试数据较弱,20就够了。int minPath , wallNo , W , H , Dx,Dy;struct Point { int val[2]; // pt[x][y].va

pku 2989

极大团问题: #include <stdio.h>#include <map>using namespace std;#define MAXN 129int n, m, cnt;struct f_int{unsigned int a,b,c,d;f_int(){a=b=c=d=0;}void operator <<(int s){switch(--s/32){ca

PKU__ACMnbsp;题目总结(转)

ACM基本算法分类、推荐学习资料和配套pku习题2008-04-12 15:15一.动态规划 参考资料: 刘汝佳《算法艺术与信息学竞赛》《算法导论》 推荐题目: http://acm.pku.edu.cn/JudgeOnline/problem?id=1141 简单 http://acm.pku.edu.cn/JudgeOnline/problem?id=2288 中

CareerCup Pots of gold game:看谁拿的钱多

问题描述: Pots of gold game: Two players A & B. There are pots of gold arranged in a line, each containing some gold coins (the players can see how many coins are there in each gold pot - perfect inform

【可视化笔记-VRVIS SWUST-2018】《城市移动数据知微探秘》_陆旻等_PKU

入坑论文1——《城市移动数据知微探秘》 下载链接: 度盘,密码20ho 本文通过可视化与可视分析技术,将数据转换为图形等用户可交互的方式,让人们理解城市这一主题,并且探索城市中不同人群的行为对城市造成的影响。 何为“城市”: 引用微软亚研院:城市计算 城市计算是一个交叉学科,是计算机科学以城市为背景,跟城市规划、交通、能源、环境、社会学和经济等学科融合的新兴领域。更具体的说,城市计算是一