poj 1606

http://poj.org/problem?id=1606

题意:有两个容量为a,b的被子,用这两个被子量出c的水。

思路:bfs和记录路径

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <queue>
  4
  5 using namespace std;
  6 struct Node{
  7     int pre,a,b;
  8     int num,f;
  9 }node[2000000];
 10 int pos;
 11 queue<Node>s;
 12 bool mark[500][500];
 13
 14 void print(int t)
 15 {
 16     switch(t)
 17     {
 18         case 1:
 19             printf("fill A\n");
 20             break;
 21         case 2:
 22             printf("fill B\n");
 23             break;
 24         case 3:
 25             printf("empty A\n");
 26             break;
 27         case 4:
 28             printf("empty B\n");
 29             break;
 30         case 5:
 31             printf("pour A B\n");
 32             break;
 33         case 6:
 34             printf("pour B A\n");
 35             break;
 36         case 7:
 37             printf("success\n");
 38         default:
 39             break;
 40     }
 41 }
 42 void put(int t){
 43     if(t!=0)
 44     {
 45         put(node[t].pre);
 46         print(node[t].f);
 47     }
 48 }
 49
 50 void bfs(int a,int b,int c)
 51 {
 52     while(!s.empty())
 53         s.pop();
 54     node[pos].a = 0;
 55     node[pos].b = 0;
 56     node[pos].pre = 0;
 57     node[pos].num = pos;
 58     mark[0][0] = false;
 59     s.push(node[pos++]);
 60     while(!s.empty())
 61     {
 62         Node tmp = s.front();
 63         s.pop();
 64         if(tmp.b==c)
 65         {
 66             node[pos].f = 7;
 67             node[pos].pre = tmp.num;
 68             put(pos);
 69             return;
 70         }
 71         if(mark[a][tmp.b])
 72         {
 73             node[pos].a = a;
 74             node[pos].b = tmp.b;
 75             node[pos].num = pos;
 76             node[pos].pre = tmp.num;
 77             node[pos].f = 1;
 78             mark[a][tmp.b] = false;
 79             s.push(node[pos++]);
 80         }
 81         if(mark[tmp.a][b])
 82         {
 83             node[pos].a = tmp.a;
 84             node[pos].b = b;
 85             node[pos].num = pos;
 86             node[pos].pre = tmp.num;
 87             node[pos].f = 2;
 88             mark[tmp.a][b] = false;
 89             s.push(node[pos++]);
 90         }
 91         if(mark[0][tmp.b])
 92         {
 93             node[pos].a = 0;
 94             node[pos].b = tmp.b;
 95             node[pos].num = pos;
 96             node[pos].pre = tmp.num;
 97             node[pos].f = 3;
 98             mark[0][tmp.b] = false;
 99             s.push(node[pos++]);
100         }
101         if(mark[tmp.a][0])
102         {
103             node[pos].a = tmp.a;
104             node[pos].b = 0;
105             node[pos].num = pos;
106             node[pos].pre = tmp.num;
107             node[pos].f = 4;
108             mark[tmp.a][0] = false;
109             s.push(node[pos++]);
110         }
111         if(tmp.a>0)
112         {
113             int t = tmp.a+tmp.b;
114             node[pos].a = t-b<0?0:t-b;
115             node[pos].b = t<b?t:b;
116             if(mark[node[pos].a][node[pos].b])
117             {
118                 node[pos].num = pos;
119                 node[pos].pre = tmp.num;
120                 node[pos].f = 5;
121                 mark[node[pos].a][node[pos].b] = false;
122                 s.push(node[pos++]);
123             }
124         }
125         if(tmp.b>0)
126         {
127             int t = tmp.a+tmp.b;
128             node[pos].b = (t-a<0)?0:t-a;
129             node[pos].a = t<a?t:a;
130             if(mark[node[pos].a][node[pos].b])
131             {
132                 node[pos].num = pos;
133                 node[pos].pre = tmp.num;
134                 node[pos].f = 6;
135                 mark[node[pos].a][node[pos].b] = false;
136                 s.push(node[pos++]);
137             }
138         }
139     }
140 }
141
142 int main()
143 {
144     int a,b,c;
145     while(~scanf("%d%d%d",&a,&b,&c))
146     {
147         memset(mark,true,sizeof(mark));
148         pos = 0;
149         bfs(a,b,c);
150     }
151     return 0;
152 }
时间: 2024-12-12 01:02:46

poj 1606的相关文章

POJ 1606 jugs(又是水壶问题)

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define sc(x) scanf("%d",&(x)) 6 #define pf(x) printf("%d\n", x) 7 #define CL(x, y) memset(x, y, sizeof(x)) 8 using nam

BFS学习总结

BFS学习总结 给你一个n*m的网格迷宫,迷宫中有些格子不能走,其他的格子都能走.然后给你起点与终点,问你从起点走到终点最少需要多少步? 上面的问题就是一个典型的BFS问题,对于这类问题来说,只要你掌握了这类问题的关键思想,其实他们都是可以用类似的思路来做的. 你可以把BFS问题想象成:从一个父亲(起点状态)生儿子(后继状态),儿子又生孙子(后继状态)的过程,只要这个家族中出生了一个满意的后代(终点状态),这个家族就不生了. 但是如果这个家族中有两个完全一样的人出生(他们的辈分不一定相同),那么

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

poj题库分类

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

POJ题目(转)

http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (

Poj 题目分类

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

POJ题目分类(转)

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea