两遍bfs ~

#include <cstdio>
#include <cstdlib>
//#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 1010
#define INF 0x7fffffff
#define inf 10000000
#define ull unsigned long long
#define ll long long
using namespace std;
int g[maxn][maxn], m, n, vis[maxn][maxn], dis1[maxn][maxn], dis2[maxn][maxn], x1, x2, y1, y2;
int q[maxn*maxn];
int dx[] = {1 , 0, 0, -1}, dy[] = {0, 1, -1, 0};
void bfs1(int x, int y)
{
int front = 0, rear = 0, u;
vis[x][y] = 1;
u = x*m+y;
dis1[x][y] = 0;
q[rear++] = u;
while(front < rear)
{
u = q[front++];
x = u/m, y = u%m;
for(int i = 0; i < 4; ++ i)
{
int nx = x+dx[i], ny = y+dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && g[nx][ny] != 1 && !vis[nx][ny])
{
int v = nx*m+ny;
q[rear++] = v;
vis[nx][ny] = 1;
dis1[nx][ny] = dis1[x][y]+1;
}
}
}
// puts("");
// for(int i = 0; i < n; ++ i)
// {
// for(int j = 0 ; j < m; ++ j)
// {
// printf("%d ", dis1[i][j]);
// }
// puts("");
// }
}
void bfs2(int x, int y)
{
int front = 0, rear = 0, u;
vis[x][y] = 1;
u = x*m+y;
dis2[x][y] = 0;
q[rear++] = u;
while(front < rear)
{
u = q[front++];
x = u/m, y = u%m;
for(int i = 0; i < 4; ++ i)
{
int nx = x+dx[i], ny = y+dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && g[nx][ny] != 1 && !vis[nx][ny])
{
int v = nx*m+ny;
q[rear++] = v;
vis[nx][ny] = 1;
dis2[nx][ny] = dis2[x][y]+1;
}
}
}
// puts("");
// for(int i = 0; i < n; ++ i)
// {
// for(int j = 0 ; j < m; ++ j)
// {
// printf("%d ", dis2[i][j]);
// }
// puts("");
// }
}
void init()
{
for(int i = 0; i < n; ++ i)
for(int j = 0 ; j < m; ++ j)
{
dis1[i][j] = dis2[i][j] = inf;
}
}
int main()
{
while(scanf("%d%d", &m, &n) == 2)
{
init();
for(int i = 0; i < n; ++ i)
for(int j = 0 ; j < m; ++ j)
{
scanf("%d", &g[i][j]);
if(g[i][j] == 2)
x1 = i, y1 = j;
else if(g[i][j] == 3)
x2 = i, y2 = j;
}
memset(vis, 0, sizeof(vis));
bfs1(x2, y2);
memset(vis, 0, sizeof(vis));
vis[x2][y2] = 1;
bfs2(x1, y1);
int ans = inf;
for(int i = 0; i < n; ++ i)
for(int j = 0 ; j < m; ++ j)
{
if(g[i][j] == 4)
ans = min(ans, dis1[i][j]+dis2[i][j]);
}
printf("%d\n", ans);
}
return 0;
}

poj 3170的更多相关文章

  1. POJ 3170 Knights of Ni (暴力,双向BFS)

    题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...

  2. POJ 3170 线段树优化DP

    题意: 思路: 先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费) f[i]表示取区间[M,i)的代价 易得f[i]=min(f[k]+w,f[i]);T1<=k ...

  3. POJ 3648 Wedding(2-SAT的模型运用+DFS | Tarjan)

    Wedding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 3170   Specia ...

  4. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  5. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  6. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  7. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  8. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  9. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

随机推荐

  1. SQL Server数据库学习总结

    经过一段时间的学习,也对数据库有了一些认识,数据库基本是由表,关系,操作组成:对于初学者首先要学的     一图胜“十”言:SQL Server 数据库总结 一个大概的总结 经过一段时间的学习,也对数 ...

  2. HTTP状态码参考

    1. HTTP状态码意义 客户机与服务器建立连接后,发送一个请求给服务器(如:Get /index.html http/1.1),在服务器接到请求后,给予客户机相应的响应信息,包括该信息的协议版本号. ...

  3. 10款强大的jQuery/HTML5应用新鲜出炉

    1.CSS3/jQuery自定义弹出窗口 多种弹出动画 这是一款利用jQuery和CSS3实现的自定义弹出窗口,这可比浏览器默认的弹出窗口漂亮多了.弹出窗口中可以自定义html,十分灵活.另外最重要的 ...

  4. java随笔 乱腾腾的 一些东西

    调用requonse.getWriter()方法时可实现文本字符串数据输出,调用response.getOutputStream()方法可现实字节流数据的输出.两种输出方式threadlocal模式和 ...

  5. [Guava源码分析]Ordering:排序

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3876466.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  6. 实验八--uart

    一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 head.S @************************************** ...

  7. DIV_ROUND_UP(x,y)实现x/y向上取整

    #define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) 1.问题 x.y都是整数,且x > 1, y > 1,求 x / y的向上取整,即: ...

  8. Amazon Kinesis Producer Library 使用记录

    Amazon Kinesis 是一种托管的服务,用于有弹性与扩展性的实时处理大规模的流数据.该服务收集大数据记录流,多个可在 Amazon EC2 实例上运行的数据处理应用程序随后可实时使用此流. 在 ...

  9. angular这个大梗的学习笔记

    angular定义一个模块(module)及控制器(controller)的局部声明方法: var app=angular.module("Myapp",[]); myapp.co ...

  10. jquery鼠标滑过提示title具体实现代码

    jquery鼠标滑过提示title的实现代码. 如下: <script type="text/javascript" src="http://ajax.google ...