FZU--2188(BFS+多条件判断,这题超好)
来源:互联网 发布:霍华德生涯最好数据 编辑:程序博客网 时间:2024/05/17 01:34
Description
一天,小明需要把x只羊和y只狼运输到河对面。船可以容纳n只动物和小明。每次小明划船时,都必须至少有一只动物来陪他,不然他会感到厌倦,不安。不论是船上还是岸上,狼的数量如果超过羊,狼就会把羊吃掉。小明需要把所有动物送到对面,且没有羊被吃掉,最少需要多少次他才可以穿过这条河?
Input
有多组数据,每组第一行输入3个整数想x, y, n (0≤ x, y,n ≤ 200)
Output
如果可以把所有动物都送过河,且没有羊死亡,则输出一个整数:最少的次数。 否则输出 -1 .
Sample Input
3 3 233 33 3
Sample Output
11-1
Hint
第一个样例
次数 船 方向 左岸 右岸(狼 羊)
0: 0 0 3 3 0 0
1: 2 0 > 1 3 2 0
2: 1 0 < 2 3 1 0
3: 2 0 > 0 3 3 0
4: 1 0 < 1 3 2 0
5: 0 2 > 1 1 2 2
6: 1 1 < 2 2 1 1
7: 0 2 > 2 0 1 3
8: 1 0 < 3 0 0 3
9: 2 0 > 1 0 2 3
10: 1 0 < 2 0 1 3
11: 2 0 > 0 0 3 3
解体思路:这题除的这好,非常值得写.运用bfs将船运输过程中的模拟出来,再加上各种条件限制.并且将执行过的方案标记,以免重复执行.
代码如下:
#include<stdio.h>#include<string.h>#include<queue>using namespace std;int v[2][210][210];//v[0][][]表示左岸上羊和狼的状态,v[1][][]表示右岸上羊和狼的状态 int n,m,nm;struct stu{ int x;//羊的个数 int y;//狼的个数 int l;//次数 int w;//位置 };void bfs(){queue<stu>q;stu s,d;s.x=n;s.y=m;s.l=0;s.w=0;//printf("%d%d%d%d",s.x,s.y,s.w ,s.l );q.push(s);while(!q.empty()){s=q.front();q.pop();if(s.x==n&&s.y==m&&s.w==1){printf("%d\n",s.l);return;}d.l=s.l+1;//开始向对面方向运输动物 d.w=s.w==1?0:1;for(int i=0;i<=s.x;i++){for(int j=0;j<=s.y;j++){if(i+j==0)continue;//小明没有动物陪 if(i+j>nm)//超额 continue;if(i<j&&i!=0)//船上羊的数目小于狼的数目,且羊的个数不为零 continue;if(s.x-i<s.y-j&&s.x-i!=0)//动物被运输走后,岸上的羊数目小于狼,且羊的数目不为零 continue; d.x=n-(s.x-i);// 动物运输过来后,岸上羊的数目 d.y=m-(s.y-j);// 动物运输过来后,岸上狼的数目 if(d.x<d.y&&d.x!=0)// 动物运输过来后,岸上的羊数目小于狼,且羊的数目不为零 continue; if(v[d.w][d.x][d.y])//该方案执行过了 continue; q.push(d); v[d.w][d.x][d.y]=1;}}}printf("-1\n");}int main(){while(scanf("%d%d%d",&n,&m,&nm)!=EOF){memset(v,0,sizeof(v));v[0][n][m]=1;//将这种状态标记bfs(); }return 0;}
0 0
- FZU--2188(BFS+多条件判断,这题超好)
- FZU--2188--过河(bfs暴力条件判断)
- FZU 2188 BFS
- FZU-1924+判断环/DFS/BFS
- FUZoj 过河I 2188 (bfs多条件判断) 好题
- FZU - 2188过河I【BFS】
- Uvaoj10603(BFS + 判断条件是重点)
- (BFS)FZU.Problem 2188 过河I
- FZU 2150 Fire Game 多起点BFS
- FZU 2124 吃豆人(BFS 坑有点多)
- FZU 2150 Fire Game 多起点BFS
- FZU 2150 Fire Game(多起点bfs)
- hdu 3345 War Chess(BFS 判断条件稍多,有陷阱)
- FZU 2124 吃豆人 (BFS)
- FZU 2196 Escape BFS
- FZU 2196(bfs)
- FZU 1408位图(bfs)
- FZU 2196 Escape【BFS】
- 自定义EditText之电话号码分段显示
- BSD10.1 系统安装
- mysql导入单个表和多个表的数据
- 关于Android的批量插入的方法
- Eclipse 报 “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
- FZU--2188(BFS+多条件判断,这题超好)
- Ionic
- MINA源码笔记(二)IoBuffer的封装
- 归并排序
- 哈夫曼树的编码与译码
- 光流法简单介绍
- fatal error LNK1123
- 10007---谈谈Memcached与Redis
- 黑马程序员——C基础之石头剪刀布游戏