FZU(2188):狼羊过河问题,状态转移,BFS求解

题目连接:http://acm.fzu.edu.cn/problem.php?pid=2188

意思:中文题目,就是给定狼羊的数目,求最小运输量把狼和羊全部送到对岸,条件是,岸上和船上的羊不能少于狼的数目,且每次渡船至少有一只动物。无解则输出-1。

只要认真分析,还是能够想到状态转移方法的。

假设左岸分别有x,y只羊和狼,右岸分别有羊和狼m,n只,假设从左岸分别把羊狼转移p,q只到右岸,则必须满足一下条件:

x-p不为0时,x-p>=y-q;

m+p不为0时,m+p>=n+q;

p不为0时,p>=q;

这里需要注意的是,当x-p或m+q或p为0时,需要特殊处理,此时,狼可以为任意值(必须客观)不必大于羊的数目。

从右岸到左岸的思想差不多。

分析到此。

 

代码:

刚开始用BFS交,TLE了,然后改写双BFS,结果却是RE,仔细一看,居然是两次都交错题目了,真是汗颜啊!!!!

不过,这题用BFS和双BFS差距还是蛮大的,一个70ms+,一个达到了900ms+。

 

单向BFS:

#include<iostream>
#include<cstdio>
#include<sstream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<string>
#define LL __int64
#define INF 0xfffffff

using namespace std;

struct state{
    int x,y;//左岸羊狼的数目
    int m,n;//右岸羊狼的数目
    int step;//转移步数
};

int vis[220][220][2];//左岸状态标志,为什么是2呢?vis[x][y]有两种不同的值
                     //可能是从右岸转移到左岸后的x,y,也可能是从右岸转移到左岸
                     //后的x,y,这两者是不一样的
int X,Y,N;

void bfs(){
    queue<state> Q;
    Q.p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值