pku 3414 pots

标签: iostream search c struct
518人阅读 评论(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;
}


 

查看评论

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

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

POJ 3414-Pots(BFS)

题目地址:POJ 3414 题意:给你a,b两个容器的容量,六种操作方法,问最少多少次可以使其中一个容器里的水达到体积c,如果不能的话则输出impossible。 思路:一共有6种操作方法,0:倒...
  • u013486414
  • u013486414
  • 2015-08-16 18:29:07
  • 750

POJ3414 Pots【倒水问题+BFS】

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19641   Accepted...
  • tigerisland45
  • tigerisland45
  • 2016-08-15 09:23:57
  • 767

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

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

Pots (POJ - 3414 )(BFS)

BFS
  • Coldfresh
  • Coldfresh
  • 2017-04-19 00:44:37
  • 151

pku 3414 Pots 经典BFS

1. 基本的状态转移是很好找的.2. 难点是判重和状态的保存.判重我用的是visited[x][y]二维数组, A为容量x, B为容量y时标记已访问;当再次A为容量x, B为容量y时,不再重复搜索.至...
  • xiaofengsheng
  • xiaofengsheng
  • 2009-12-08 18:40:00
  • 530

poj 3414 Pots

很简单的一题,写过倒红酒的人绝对是秒过。 #include #include #include #define N 101 using namespace std; int a,b,c; bool ...
  • purevegetable
  • purevegetable
  • 2013-09-02 13:21:51
  • 469

POJ 3414 Pots BFS

题意:给你两个罐子,你可以执行以下操作: 1. FILL(i)        将罐子 i 装满水 2. DROP(i)      将罐子 i 中的水倒掉 3. POUR(i,j)    将罐子 ...
  • Tsaid
  • Tsaid
  • 2011-09-08 09:52:34
  • 243

POJ 3414 Pots(bfs)

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17456   Accepted: 7407   Spe...
  • hhu1506010220
  • hhu1506010220
  • 2017-07-23 12:53:25
  • 99

POJ 3414 Pots bfs

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13419   Accepted...
  • Houheshuai
  • Houheshuai
  • 2016-05-02 15:16:54
  • 154
    个人资料
    等级:
    访问量: 4万+
    积分: 847
    排名: 6万+
    文章分类
    最新评论