关闭

pku 3414 pots

503人阅读 评论(0) 收藏 举报

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;
}


 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

poj 3414 Pots(广搜BFS+路径输出)

poj3414 Pots(BFS+路径输出)
  • u012860063
  • u012860063
  • 2014-07-14 20:18
  • 1853

poj 3414 Pots (bfs+路径记录)

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10071   Accepted...
  • u011721440
  • u011721440
  • 2014-10-05 16:01
  • 1091

POJ 3414 Pots【bfs模拟倒水问题】

BFS 处理容器倒水问题 给你两个容器 A B 要你用这两个容器称量出 C 体积的水 同时输出路径
  • Cfreezhan
  • Cfreezhan
  • 2013-08-13 21:14
  • 4003

POJ3414-Pots

  • 2011-07-31 22:40
  • 9KB
  • 下载

poj 3414 Pots 广度优先搜索

Description You are given two pots, having the volume of A and B liters respectively. The followi...
  • u013087645
  • u013087645
  • 2014-07-30 00:53
  • 664

POJ 3414 Pots 我没有用广搜做

Pots Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Sub...
  • J1nAB1n9
  • J1nAB1n9
  • 2017-08-06 19:30
  • 107

[kuangbin带你飞]专题一 简单搜索H - Pots(POJ 3414)

H - Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S...
  • ZZ_AC
  • ZZ_AC
  • 2015-11-10 21:49
  • 463

POJ 3414 Pots 解题报告(搜索)

题目大意:两个杯子,容量为A,B,每次可以装满,倒掉,或者A倒进B或者B倒进A,共计六种操作。问如何得到容量C并且打印此过程。     解题报告:每次六种操作,凭感觉也知道是广搜。     难点有两个...
  • kbdwo
  • kbdwo
  • 2013-08-04 13:17
  • 963

POJ 3414 Pots(简单模拟+dfs)

Description 给你两个容器,求出获得指定量水的步骤 三个操作 FILL(A):将A容器装满水 DROP(A):将A容器中的水倒出 POUR(A,B):将A容器中的水全部倒...
  • V5ZSQ
  • V5ZSQ
  • 2015-07-14 09:30
  • 239

POJ3414 Pots

= =BFS水题 #include #include #include #include #include using namespace std; int A,B,C; class node { ...
  • zhangwei1120112119
  • zhangwei1120112119
  • 2013-04-23 16:08
  • 365
    个人资料
    • 访问:42809次
    • 积分:836
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:6篇
    • 译文:0篇
    • 评论:4条
    文章分类