两遍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. 杭电ACM2085--核反应堆

    http://acm.hdu.edu.cn/showproblem.php?pid=2085 这也是一个简单的的递推. a[i][0] = 3*a[i-1][0]+2*a[i-1][1]; a[i][ ...

  2. poj 3268 Silver Cow Party

                                                                                                       S ...

  3. VC和VS系列(2005)编译器对双精度浮点溢出的处理

    作者:风影残烛 在还原代码的过程中.目前程序是采用VS2005(以上版本)写的. 我使用的是vc6.0,结果.在运算的时候.发现编译器对 // FpuTlxTest.cpp : 定义控制台应用程序的入 ...

  4. 转载: ABAP动态内表操作

    顾名思义,动态表的列是可以根据数据的变化而变化的,会使报表显示更简洁漂亮. 以下是实现方法. ------------------------------------------- 1, 创建动态内表 ...

  5. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  6. Windows Phone 8仿Toast弹出通知。

    Wp8后台收到消息可以弹出Toast通知,可是应用在前台跑的时候却好像没有办法弹出Toast通知.而需求上有要求要弹出Toast通知,在这种情况下,就开始考虑是否能够做一个类似Toast的弹出通知呢? ...

  7. 《boot分区监控的小脚本》

    #!/bin/bash TEST=`df | grep "boot" |awk '{print $5}' |cut -f1 -d"%"` if [ $TEST ...

  8. Linux 本地yum源搭建和网络yum源搭建

    一.本地yum源搭建 首先挂载上光盘 [root@www /]# mount /dev/cdrom /media/cdrom/ 系统默认已经安装了可使用yum的软件包,所以可以直接配置: [root@ ...

  9. [DevExpress]ChartControl之时间轴示例

    关键代码: using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; name ...

  10. 解决Handler与Activity同步冲突

    这个问题可以由Handler的一个子类HandlerThread来解决. 程序参考自Mars老师的Android课程第一季第十五集. 代码以及注释有所改动,如下: package com.handle ...