poj3414Pots(bfs模拟数组 回溯路径)
来源:互联网 发布:金蝶软件精斗云 编辑:程序博客网 时间:2024/06/10 17:43
Description
You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:
- FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;
- DROP(i) empty the pot i to the drain;
- POUR(i,j) pour from pot i to pot j; after this operation either the potj is full (and there may be some water left in the pot i), or the poti is empty (and all its contents have been moved to the pot j).
Write a program to find the shortest possible sequence of these operations that will yield exactlyC liters of water in one of the pots.
Input
On the first and only line are the numbers A, B, andC. These are all integers in the range from 1 to 100 and C≤max(A,B).
Output
The first line of the output must contain the length of the sequence of operationsK. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.
Sample Input
3 5 4
Sample Output
6FILL(2)POUR(2,1)DROP(1)POUR(2,1)FILL(2)POUR(2,1)
Source
#include<stdio.h>#include<string.h>struct node{ int k1;//记录第一杯水的状态 int k2;//记录第二被水的状态 int step;//记录当前步数 int oper;//记录当前的操作 int pre;//记录前一步的编号}q[110000];//数组开大一点 要不然waint vis[1100][1100];//标记两个水杯的状态是否出现int a,b,c;int flag;int sum;//记录总的步数int last;//记录最后一步的下标void bfs(){ memset(vis,0,sizeof(vis)); struct node tmp; int head,tail; head=tail=0; tmp.k1=0; tmp.k2=0; tmp.step=0; tmp.oper=0; tmp.pre=0; vis[0][0]=1; q[tail++]=tmp; while(head<tail) { tmp=q[head++]; if(tmp.k1==c||tmp.k2==c) { printf("%d\n",tmp.step); sum=tmp.step; last=head-1; flag=1; break; } struct node tmp1=tmp; for(int i=1;i<=6;i++) { if(i==1)//fill(1) { tmp1.k1=a; tmp1.k2=tmp.k2; } else if(i==2)//fill(2) { tmp1.k1=tmp.k1; tmp1.k2=b; } else if(i==3)//drop(1); { tmp1.k1=0; tmp1.k2=tmp.k2; } else if(i==4)//drop(2); { tmp1.k2=0; tmp1.k1=tmp.k1; } else if(i==5)//pour(1,2); { if(tmp.k1+tmp.k2<=b) { tmp1.k1=0; tmp1.k2=tmp.k1+tmp.k2; } else { tmp1.k1=tmp.k1+tmp.k2-b; tmp1.k2=b; } } else if(i==6)//pour(2,1); { if(tmp.k1+tmp.k2<=a) { tmp1.k2=0; tmp1.k1=tmp.k1+tmp.k2; } else { tmp1.k2=tmp.k1+tmp.k2-a; tmp1.k1=a; } } if(!vis[tmp1.k1][tmp1.k2]&&tmp1.k1>=0&&tmp1.k1<=100&&tmp1.k2>=0&&tmp1.k2<=100) { tmp1.step=tmp.step+1; tmp1.oper=i; tmp1.pre=head-1; q[tail++]=tmp1; vis[tmp1.k1][tmp1.k2]=1; } } }}int main(){ int i,j,k; while(~scanf("%d%d%d",&a,&b,&c)) { int bh[11000];//记录编号 flag=0;//标记是否成功找到 bfs(); if(flag) { bh[sum]=last;//最后一步的编号 for(i=sum-1;i>0;i--) { bh[i]=q[bh[i+1]].pre;//本次的编号就是下一步里pre存的 } for(i=1;i<=sum;i++) { if(q[bh[i]].oper==1) printf("FILL(1)\n"); else if(q[bh[i]].oper==2) printf("FILL(2)\n"); else if(q[bh[i]].oper==3) printf("DROP(1)\n"); else if(q[bh[i]].oper==4) printf("DROP(2)\n"); else if(q[bh[i]].oper==5) printf("POUR(1,2)\n"); else if(q[bh[i]].oper==6) printf("POUR(2,1)\n"); } } else printf("impossible\n"); } return 0;}
- poj3414Pots(bfs模拟数组 回溯路径)
- POJ3414Pots【BFS】
- BFS + 回溯路径 POJ
- poj3414pots
- hdu 1026 bfs(数组模拟,路径输出)
- bfs+路径记录(数组模拟队列实现)
- poj3414(用bfs模拟并回溯)
- POJ 3414--Pots(BFS+回溯路径)
- bfs,dfs(回溯路径)倒水
- Pots(bfs+路径记录与回溯)
- BFS(带回溯路径) 典例 代码
- POJ---- Pots ----BFS的路径回溯问题
- POJ 3984-迷宫问题(BFS+回溯路径)
- 迷宫BFS+递归回溯找爹打印路径
- FOJ 1205 小鼠迷宫问题【BFS+dfs回溯查找路径】
- bfs+预处理+路径回溯+字典序最小+hash
- 回溯法-bfs--迷宫问题的最短路径
- POJ3414 模拟倒水问题 BFS记录路径
- SpringMVC 文件上传,使用的MultipartFile
- 文章标题
- 怎样写一个构造器
- std::map的使用方法
- 初学android-调用百度api显示地图(出现显示网格问题)
- poj3414Pots(bfs模拟数组 回溯路径)
- 第四章Response和增删改查(1)
- iOS 关闭和开启闪光灯
- hdu 5828 Rikka with Sequence 【线段树+优化】
- Ionic调用摄像头拍照和选择图库照片功能的注意点
- QueryRunner 结果处理器
- Android-ViewPagerIndicator使用方法
- 机器学习中的相似性度量
- Android开发笔记之主题背景的修改(设置Theme.NoTitleBar后Activity背景变成黑色)