http://www.lydsy.com/JudgeOnline/problem.php?id=1632

我简直是个sb。。。

。。。

bfs都不会写。。

算方案还用2个bfs!

都不会整合到一个!

然后赤裸裸的wa了。

然后对拍。。。

果然错的地方很。。。

。。

然后貌似自己想改bfs,只需一个就行了。。

而且方案也改对了????

然后不知哪里写挫了。。。然后样例过不了了。。

然后无奈看别人题解了。。。

QAQ

噗,方案和我想的一样,但是。。。。。。。。。。。。。。。我忘记了个东西,,标记啊。。

噗。。我尽然没标记。。。怪不得。。

吐槽完毕。。

这个bfs的时候更新很简单的。

自己看看就懂了的。。只要记住要标记!!!!要不然答案会大得离奇

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr2(a, b, c) for1(i, 1, b) { for1(j, 1, c) cout << a[i][j] << '\t'; cout << endl; }
#define printarr1(a, b) for1(i, 1, b) cout << a[i]; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=35, Q=10000, dx[]={-1, -2, -2, -1, 1, 2, 2, 1}, dy[]={-2, -1, 1, 2, 2, 1, -1, -2};
int mp[N][N], f[N][N], d[N][N], vis[N][N], n, m, X, Y, XX, YY, front, tail;
struct dat { int x, y; }q[Q];
long long p[N][N]; void bfs1() {
front=tail=0;
q[tail].x=X, q[tail].y=Y; ++tail;
CC(f, 0x3f); CC(d, 0x3f); f[X][Y]=d[X][Y]=0; vis[X][Y]=p[X][Y]=1;
while(front!=tail) {
dat &t=q[front++]; if(front==Q) front=0;
int x=t.x, y=t.y; vis[x][y]=0;
if(x==XX && y==YY) continue;
rep(i, 8) {
int fx=dx[i]+x, fy=dy[i]+y;
if(fx<1 || fy<1 || fx>n || fy>m || mp[fx][fy]==2) continue;
dat &t2=q[tail];
int add=mp[fx][fy]==0;
if(f[fx][fy]>f[x][y]+add) {
f[fx][fy]=f[x][y]+add;
d[fx][fy]=d[x][y]+1;
p[fx][fy]=p[x][y];
if(!vis[fx][fy]) t2.x=fx, t2.y=fy, vis[fx][fy]=1; if(++tail==Q) tail=0;
}
else if(f[fx][fy]==f[x][y]+add && d[fx][fy]>d[x][y]+1) {
d[fx][fy]=d[x][y]+1;
p[fx][fy]=p[x][y];
if(!vis[fx][fy]) t2.x=fx, t2.y=fy, vis[fx][fy]=1; if(++tail==Q) tail=0;
}
else if(f[fx][fy]==f[x][y]+add && d[fx][fy]==d[x][y]+1) {
p[fx][fy]+=p[x][y];
if(!vis[fx][fy]) t2.x=fx, t2.y=fy, vis[fx][fy]=1; if(++tail==Q) tail=0;
}
}
}
}
int main() {
read(n); read(m);
for1(i, 1, n) for1(j, 1, m) {
int t=getint(); mp[i][j]=t;
if(t==3) X=i, Y=j; else if(t==4) XX=i, YY=j;
}
bfs1();
if(f[XX][YY]==0x3f3f3f3f) puts("-1");
else printf("%d\n%d\n%lld\n", f[XX][YY], d[XX][YY], p[XX][YY]);
return 0;
}

【BZOJ】1632: [Usaco2007 Feb]Lilypad Pond(bfs)的更多相关文章

  1. 【BZOJ】1631: [Usaco2007 Feb]Cow Party(dijkstra)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1631 看到m<=100000果断用dij(可是好像dij比spfa还慢了在这里?)//upd: ...

  2. 【BZOJ】2014: [Usaco2010 Feb]Chocolate Buying(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2014 这应该是显然的贪心吧,先排序,然后按花费取 #include <cstdio> # ...

  3. 【BZOJ】2015: [Usaco2010 Feb]Chocolate Giving(spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2015 这种水题真没啥好说的.. #include <cstdio> #include & ...

  4. 【BZOJ】3300: [USACO2011 Feb]Best Parenthesis(模拟)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3300 这个细节太多QAQ 只要将所有的括号'('匹配到下一个')'然后dfs即可 简单吧,,, #i ...

  5. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond

    题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 390  Solved: 109[ ...

  6. 1632: [Usaco2007 Feb]Lilypad Pond

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 404  Solved: 118[Sub ...

  7. BZOJ 1632 [Usaco2007 Feb]Lilypad Pond:spfa【同时更新:经过边的数量最小】【路径数量】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1632 题意: 有一个n*m的池塘.0代表水,1代表荷花,2代表岩石,3代表起点,4代表终点 ...

  8. 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序

    [算法]数学置换 [题意]给定n个数,要求通过若干次交换两个数的操作得到排序后的状态,每次交换代价为两数之和,求最小代价. [题解] 考虑置换的定义:置换就是把n个数做一个全排列. 从原数组到排序数组 ...

  9. 【BZOJ】3053: The Closest M Points(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...

随机推荐

  1. java中Queue接口

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类 ...

  2. 关于iOS上使用WWW引起的内存泄漏的临时解决方案

    原地址:http://www.unity蛮牛.com/thread-16493-1-1.html 目前,在的4.3.3.和4.3.4版本中存在一个iOS平台上的内存泄漏问题,即当使用WWW来下载和加载 ...

  3. Python中的__name__

    python中if __name__ == '__main__': 的解析 经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且 ...

  4. Php取扩展名

    Php取扩展名 /** * 取扩展名 */ function getext($url){ $base = parse_url($url); $name = basename($base['path'] ...

  5. Mysql 如何查询两个时间段之间的数据?

    Mysql 如何查询两个时间段之间的数据?

  6. shader学习之路(1)- half lambert

    在学习这个shader之前先提个经常使用概念.即光照模型.LightModel(光照模型)即是对于物体怎么对打在其上的光做出视觉反应的数学模型.意即表达物体对光反应产生的视觉效果与入射光.物体表面属性 ...

  7. 进程上下文切换 – 残酷的性能杀手(上)(转载cppthinker.com)

    对于服务器的优化,很多人都有自己的经验和见解,但就我观察,有两点常常会被人忽视 – 上下文切换 和 Cache Line同步 问题,人们往往都会习惯性地把视线集中在尽力减少内存拷贝,减少IO次数这样的 ...

  8. Linux内核部件分析 原子性操作atomic_t

    在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的.在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的.为了弥补 ...

  9. 【VB编程】05.MsgBox与InputBox函数

    在VBA程序中,数据的输入输出是通过函数实现的,其实现的方式是通过对话框的形式表示出来的.例如MsgBox,Inputbox等,不要误认为是输入输出语句的关键字,其实仅仅是一个普通函数而已. [Msg ...

  10. Python-Mac OS X EI Capitan下安装Scrapy

    sudo pip install scrapy --ignore-installed six #sudo pip install scrapy --upgrade --ignore-installed ...