poj 3414 bfs水题但是麻烦
2016-03-08 23:59
330 查看
啦啦啦,这个太刷成就感了!!!!115行代码哦
poj 3414原题戳这
大致题意:
给你容器a,容器b,还有容量c;
问你是否能够通过有限的步骤达到c的目标状态呢?
嗯,关于path数组其实又参看大神的,不得不说太腻害了
操作6种:
1.装满a FILL(1)
2.装满b FILL(2)
3.清空a DROP(1)
4.清空b DROP(2)
5.把A倒入B POUR(1,2) (注意不能溢出o
就有2种情况,装得满和装不满;
6.把b装进a同上
算法:bfs,加数组??
ps and耐心,也就是你要有写完题的耐心和改错的耐心【哭
下面是codes
poj 3414原题戳这
大致题意:
给你容器a,容器b,还有容量c;
问你是否能够通过有限的步骤达到c的目标状态呢?
嗯,关于path数组其实又参看大神的,不得不说太腻害了
操作6种:
1.装满a FILL(1)
2.装满b FILL(2)
3.清空a DROP(1)
4.清空b DROP(2)
5.把A倒入B POUR(1,2) (注意不能溢出o
就有2种情况,装得满和装不满;
6.把b装进a同上
算法:bfs,加数组??
ps and耐心,也就是你要有写完题的耐心和改错的耐心【哭
下面是codes
[code]poj 3414 228k 0ms #include<cstdio> #include<queue> #include<cstring> using namespace std; int m,n,k; int vis[105][105]; char opr[20][20]= {"FILL(1)" , "FILL(2)" , "DROP(1)" , "DROP(2)" , "POUR(1,2)" , "POUR(2,1)" }; //共6种操作 struct node { int x,y,step;// 当前水量和步数 int path[200]; //用来记录路径的数组 //!! }; void bfs( ) { int i,j; int kx,ky; memset(vis,0,sizeof(vis)); queue<node>q; node now,next;//当前操作和下步操作 now.x=0; now.y=0; now.step=0; q.push(now); vis[0][0]=1; while(!q.empty()) { now=q.front(); q.pop(); if(now.x==k||now.y==k)//达到目标状态 { printf("%d\n",now.step); for( i=1; i<=now.step; i++) { printf("%s\n",opr[now.path[i]]); } return; } for(i=1; i<=6; i++) // 共六种操作 { if(i == 1 ) //第一种操作,装满1; { next.y=now.y; next.x=m; now.path[now.step+1]=0; } else if(i == 2)//sec,fill 2 { next.x=now.x; next.y=n; now.path[now.step+1]=1; } else if(i == 3)//third,drop 1; { next.y=now.y; next.x=0; now.path[now.step+1]=2; } else if(i == 4)// fourth,drop 2 { next.x=now.x; next.y=0; now.path[now.step+1]=3; } else if(i == 5) { if(n-now.y>now.x) //每种pour 应有两种情况 { next.x=0; next.y=now.x+now.y; } else { next.y=n; next.x=now.x-n+now.y; } now.path[now.step+1]=4; } else if(i == 6) { if(m-now.x>now.y)//装不满 { next.y=0; next.x=now.x+now.y; } else//装得满 { next.x=m;//最多m next.y=now.y-m+now.x; } now.path[now.step+1]=5; } if(vis[next.x][next.y] == 1) continue; vis[next.x][next.y]=1; next.step=now.step+1; for(j=1; j<=next.step; j++) //!!!!!!记录之前的operation,在这傻了很久 { next.path[j]=now.path[j]; } q.push(next); } } printf("impossible\n"); return; } int main() { int i; scanf("%d%d%d",&m,&n,&k); bfs(); return 0; }
相关文章推荐
- linux
- dos
- Java基础之String,StringBuilder,StringBuffer
- 在博客园的第一篇博文
- 探索软件工程道路上的我II (Θ∀Θ#)
- JDBC连接池
- CSS选择器、优先级与匹配原理
- Activity四种启动模式
- NoHttp开源Android网络框架1.0.0之架构分析
- PivotTable 实战
- Maven依赖冲突之httpclient.jar包冲突异常分析
- 各种字符串Hash函数比较
- url
- C#使用DataSet Datatable更新数据库的三种实现方法
- POJ 3414 解题报告!
- POJ 3414 解题报告!
- 蓝桥杯-s01串
- ipc
- js数组的sort排序详解
- c/C++