POJ3414Pots【BFS】

大意:有两个杯子  三种操作

You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:

  1. FILL(i)        fill the pot i (1 ≤ ≤ 2) from the tap;
  2. DROP(i)      empty the pot i to the drain;
  3. POUR(i,j)    pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j)

问要达到指定的容量需要操作的最少次数

分析:

BFS扩展每种情况然后再输出即可

代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <queue>
  5 using namespace std;
  6
  7 const int maxn = 1000;
  8
  9 struct Node {
 10     int x, y;
 11     int caozuo;
 12     int a, b;
 13     int fa, now;
 14     int num;
 15 }node[maxn + 10];
 16
 17 queue<Node> q;
 18 int vis[105][105];
 19
 20 void dfs(Node n0) {
 21     if(n0.caozuo == 0) {
 22         return ;
 23     }
 24     dfs(node[n0.fa + 1]);
 25     if(n0.caozuo == 1) {
 26         printf("FILL(%d)\n", n0.a + n0.b);
 27     } else if(n0.caozuo == 2) {
 28         printf("DROP(%d)\n", n0.a + n0.b);
 29     } else {
 30         printf("POUR(%d,%d)\n", n0.a, n0.b);
 31     }
 32 }
 33
 34 int main() {
 35     int A, B, C;
 36     while(EOF != scanf("%d %d %d",&A, &B, &C) ) {
 37         memset(vis, 0, sizeof(vis));
 38         int cnt = 0;
 39         node[cnt++] = (Node) { 0, 0, 0, 0, 0, 0, 0, 0 };
 40         q.push(node[0]); vis[0][0] = 1;
 41         bool flag = false;
 42         int x = 0;
 43         Node ans;
 44         cnt++;
 45         while(!q.empty()) {
 46             if(x++ > maxn) break;
 47
 48             Node n0 = q.front(); q.pop();
 49 //            printf("now = %d   x = %d   y = %d   fa = %d  num = %d  caozuo = %d\n", n0.now, n0.x, n0.y, n0.fa, n0.num, n0.caozuo);
 50
 51             if(n0.x == C || n0.y == C) {
 52                 flag = true;
 53                 ans = n0;
 54                 break;
 55             }
 56
 57             if(!vis[A][n0.y]) {
 58                 node[cnt++] = (Node) { A, n0.y, 1, 1, 0, n0.now, cnt - 1, n0.num + 1};
 59                 q.push(node[cnt - 1]);
 60                 vis[A][n0.y] = 1;
 61             }
 62
 63             if(!vis[n0.x][B]) {
 64                 node[cnt++] = (Node) { n0.x, B, 1, 1, 1, n0.now, cnt - 1,n0.num + 1 };
 65                 q.push(node[cnt - 1]);
 66                 vis[n0.x][B] = 1;
 67             }
 68
 69             if(!vis[0][n0.y]) {
 70                 node[cnt++] = (Node) { 0, n0.y, 2, 1, 0, n0.now, cnt - 1,n0.num + 1 };
 71                 q.push(node[cnt - 1]);
 72                 vis[0][n0.y] = 1;
 73             }
 74
 75             if(!vis[n0.x][0]) {
 76                 node[cnt++] = (Node) { n0.x, 0, 2, 1, 1, n0.now, cnt - 1,n0.num + 1 };
 77                 q.push(node[cnt - 1]);
 78                 vis[n0.x][0] = 1;
 79             }
 80
 81             if(n0.x + n0.y <= B) {
 82                 if(!vis[0][n0.x + n0.y]) {
 83                     node[cnt++] = (Node) { 0, n0.x + n0.y, 3, 1, 2, n0.now, cnt - 1, n0.num + 1};
 84                     q.push(node[cnt -1]);
 85                     vis[0][n0.x + n0.y] = 1;
 86                 }
 87             } else {
 88                 if(!vis[n0.x + n0.y - B][B]) {
 89                     node[cnt++] = (Node) { n0.x + n0.y - B, B, 3, 1, 2, n0.now, cnt - 1,n0.num + 1 };
 90                     q.push(node[cnt - 1]);
 91                     vis[n0.x + n0.y - B][B] = 1;
 92                 }
 93             }
 94
 95             if(n0.x + n0.y <= A) {
 96                 if(!vis[n0.x + n0.y][0]) {
 97                     node[cnt++] = (Node) { n0.x + n0.y, 0, 3, 2, 1, n0.now, cnt - 1,n0.num + 1};
 98                     q.push(node[cnt -1]);
 99                     vis[n0.x + n0.y][0] = 1;
100                 }
101             } else {
102                 if(!vis[A][n0.x + n0.y - A]) {
103                     node[cnt++] = (Node) { A, n0.x + n0.y - A, 3, 2, 1, n0.now, cnt - 1,n0.num + 1};
104                     q.push(node[cnt - 1]);
105                     vis[A][n0.x + n0.y - A] = 1;
106                 }
107             }
108         }
109         if(!flag) {
110             puts("impossible");
111             continue;
112         }
113         printf("%d\n", ans.num);
114         Node n0 = ans;
115         dfs(n0);
116     }
117     return 0;
118 }

时间: 2024-10-20 12:18:32

POJ3414Pots【BFS】的相关文章

【bfs】【中等难度】tyvj P1234 - bench与奔驰

P1234 - bench与奔驰 From zhangbh001    Normal (OI) 总时限:10s    内存限制:128MB    代码长度 限制:64KB P1234 - bench与奔驰 背景 Background 公园里有个人在练开奔驰 - -!,但是总是撞在bench上 (众人曰:狼来了,快跑啊!) 描述 Description 公园里的bench与奔驰都是无敌的,不会被撞坏.由于开奔驰的人比较"有特点",总是向上下左右四个方向开,而且只会在撞到椅子之后改变方向(

hdoj 1312 Red and Black 【BFS】

题意:一共有四个方向,从'@'出发,找能到达'.'的个数, #是不能通过的. 策略:广搜. 这道题属于最简单的bfs了. 代码: #include<stdio.h> #include<string.h> #include<queue> using std::queue; bool vis[25][25]; char s[25][25]; int n, m; int ans = 0; struct node{ int x, y; }; node st; const int

HDU1242 Rescue 【BFS】

Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16314    Accepted Submission(s): 5926 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is

HDU 1253 胜利大逃亡 NYOJ 523【BFS】

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24608    Accepted Submission(s): 9427 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的

NYOJ 284 坦克大战 【BFS】+【优先队列】

坦克大战 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that co

【BFS】uva10047The Monocycle

/* 本题的特殊之处,到达一个格子时,因为朝向不同,以及接触地面的颜色不同, 会处于不同的状态::::::::: 把(x, y, d, c)作为一个结点,表示所在位置(x, y),方向为d,颜色为c;;;;; ------------------------------------------------------------------------ 在方向上我们把前,左,右编号为0,1,2:::: 颜色,从蓝色开始编号为0,1,2,3:::::::::: ------------------

【BFS】uva11624Fire!

/* bfs宽度遍历 -------------------------------------------------------------------------- 对人和火同时进行bfs,,注意应该先火后人,即如果在人到达该格子前,格子已经着火 则不应该走,最后人走到边界无路可走,则IMPOSSIBLE!!!!!!!!!!!! --------------------------------------------------------------------------- 两次bfs

【bfs】hdu 1104 Remainder

[bfs]hdu 1104 Remainder 题目链接:hdu 1104 Remainder 很不错的一道搜索题目,但是有几个关键问题要注意. 最短路径,果断bfs+Queue 路径的存储问题,之前只想把每一步的计算结果存储到queue(int)Q中,后来发现路径无法记录,就选择存储节点的方式并用string保存路径,queue(node)Q,开一个临时的节点node p,每进行一次运算就更新它的路径string+'op',最终输出的一定是完整路径!! 但最关键的是取模!!!!! discus

Poj 3087 Shuffle&#39;m Up 【BFS】

Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6556 Accepted: 3077 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of pok