题目链接:http://poj.org/problem?id=3170
Description
Input
Output
Sample Input
8 4 4 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 2 1 1 3 0 4 0 0 0 0 4 1 1 1 0
Sample Output
11
Hint
Source
PS:
两次BFS,
第一次是找出2到4的最短距离
第二次是找出3到4的最短距离
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define INF 0x3f3f3f3f
#define MAXN 1000+47
using namespace std;
int w, h;
int s, e;
int G[MAXN][MAXN];
int dis1[MAXN][MAXN], dis2[MAXN][MAXN];
int xx[4] = {0,0,-1,1};
int yy[4] = {1,-1,0,0};
bool vis[MAXN][MAXN];
int MIN(int a, int b)
{
if(a < b)
return a;
return b;
}
void bfs1(int x,int y)
{
queue<int>q;
int u = x*w+y;
vis[x][y]=true;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
x = u/w;
y = u%w;
for(int i = 0; i < 4; i++)
{
int dx = x + xx[i];
int dy = y + yy[i];
if(dx>=0&&dx<h&&dy>=0&&dy<w&&G[dx][dy]!=1&&!vis[dx][dy])
{
int v = dx*w+dy;
q.push(v);
vis[dx][dy] = true;
dis1[dx][dy] = dis1[x][y]+1;
}
}
}
}
void bfs2(int x,int y)
{
queue<int>q;
int u = x*w+y;
vis[x][y]=true;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
x = u/w;
y = u%w;
for(int i = 0; i < 4; i++)
{
int dx = x+xx[i];
int dy = y+yy[i];
if(dx>=0&&dx<h&&dy>=0&&dy<w&&G[dx][dy]!=1&&!vis[dx][dy])
{
int v = dx*w+dy;
q.push(v);
vis[dx][dy] = true;
dis2[dx][dy] = dis2[x][y]+1;
}
}
}
}
int main()
{
while(~scanf("%d%d",&w,&h))
{
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
scanf("%d",&G[i][j]);
dis1[i][j] = dis2[i][j] = INF;
if(G[i][j] == 2)
s = i*w+j;
else if(G[i][j] == 3)
e = i*w+j;
}
}
memset(vis,false,sizeof(vis));
dis1[s/w][s%w]=0;
bfs1(s/w,s%w);//2 到 4
memset(vis,false,sizeof(vis));
dis2[e/w][e%w]=0;
bfs2(e/w,e%w);//3 到 4
int min_dis = INF;
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
if(G[i][j] == 4)
{
min_dis = MIN(min_dis,dis1[i][j]+dis2[i][j]);
}
}
}
printf("%d\n",min_dis);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 3170 Knights of Ni(两次BFS啊)
原文地址:http://blog.csdn.net/u012860063/article/details/46860063