poj 3170
两遍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的更多相关文章
- POJ 3170 Knights of Ni (暴力,双向BFS)
题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...
- POJ 3170 线段树优化DP
题意: 思路: 先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费) f[i]表示取区间[M,i)的代价 易得f[i]=min(f[k]+w,f[i]);T1<=k ...
- POJ 3648 Wedding(2-SAT的模型运用+DFS | Tarjan)
Wedding Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10427 Accepted: 3170 Specia ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
随机推荐
- 移动Web轮播图IOS卡顿的问题
晚饭前,被测试吐槽说,banner轮播手动左右滑的时候会卡顿.我一看不科学啊,大水果手机怎么会卡顿.我一看测试手中拿的是iPod,我觉得大概是这小玩意性能不强悍,后来又拿来5S,依然会卡顿,有趣的是, ...
- gcc与g++的区别
一:gcc与g++比较 编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而 c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确, ...
- Java直接插入排序
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 1)将第一待排序序列第一个元素看做一个有序序列,把第二 ...
- 小米pad MI PAD 开发者选项、USB调试开启方式
设置->关于平板->在MIUI版本一行连续点击7次. 之后就出现了开发者选项.可以开启USB调试等. 你能想到吗……??
- Linux实现的IEEE 802.q VLAN
本文转载自: http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN ---------- ...
- AnyCAD脚本模型
采用AnyCAD建立的模型, 基于AnyCAD.Net SDK在C#中展示模型:
- VBA访问SQLSERVER2005筛选数据库
EXCEL版本2010, 引用 Private Sub CommandButton1_Click() Dim conn As New ADODB.Connection Dim rs As New AD ...
- Oracle中排序列中值相同引发的问题(译)
This queston came up on the Oracle newsgroup a few days ago: 这个问题在Oracle的新闻中心被提出了一段时间: I have a tabl ...
- Js 和 PHP 中保留小数点后X位数的方法 toFixed、round、number_format、sprintf
在 Javacript 中保留小数点后两位数的方法为 toFixed(2),其中的2为保留两位,写多少就保留多少了,满5进1. Javacript例子: var num = 24.54789523; ...
- 选项切换条--第三方开源--SHSegmentControl
SHSegmentControl在github上的项目主页地址:https://github.com/7heaven/SHSegmentControl SHSegmentControl使用简单,在xm ...