title: HDU-2612
categories:
- ACM
- BFS
tags: - 两次BFS
- 函数数组形参
date: 2020-03-02 09:47:16
两个标志数组,两次BFS,不是双BFS,双BFS应该是双入口BFS,是一次BFS,两个入口而已,UVA-11624这才是双入口BFS。二维数组对应的函数形参必须声明第二维,并且不能对传进函数的形参用memset,因为sizeof(数组)不对,这样只能自行指定memset的大小了。
问题
想办法
*时间限制:3000/1000 MS(Java /其他)内存限制:32768/32768 K(Java /其他)
总提交数量:35622接受提交数量:11329
*
问题描述
终于在杭州经过一年的学习,一分飞终于到了宁波。离开宁波一年后,一分飞有很多人见面。特别是好朋友Merceki。
Yifenfei的家在乡下,而Merceki的家在城市中心。因此,易芬菲与Merceki安排了在肯德基会面。宁波有很多肯德基,他们想选择一种让总时间最短的肯德基。
现在给您一张宁波地图,yifenfei和Merceki都可以通过成本11分钟左右上下移动到相邻的道路。
输入值
输入包含多个测试用例。
每个测试用例包括前两个整数n,m。(2 <= n,m <= 200)。
接下来的n行,每行包含m个字符。
“ Y”表示一分钱的初始职位。
“ M”表示Merceki的初始位置。
'#'禁止道路;
‘。’ 路。
'@'KCF
输出量
对于每个测试用例输出,yifenfei和Merceki到达肯德基之一的最短总时间。您可以肯定总是有一个肯德基可以让他们见面。
样本输入
4 4
Y。#@
....
。#..
@ .. M
4 4
Y。#@
....
。#..
@#。M
5 5
Y .. @。
。#...
。#...
@ .. M。
#...#
样本输出
66
88
66
算法
#include<stdio.h>
#include<iostream>
#include<string.h>
#include <queue>
#include<math.h>
using namespace std;
char map[201][201];
int v1[201][201];
int v2[201][201];
int m,n,minn;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct Point{
int x,y;
} a,b,y,M;
void bfs(int x,int y,int v[201][201]){
memset(v,0,4*201*201);
a.x=x;a.y=y;
queue<Point> q;
q.push(a);
v[x][y]=1;
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=0;i<4;i++)
{
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
if(b.x>=0&&b.x<m&&b.y>=0&&b.y<n&&map[b.x][b.y]!='#'&&v[b.x][b.y]==0)
{
v[b.x][b.y]=v[a.x][a.y]+1;
q.push(b);
}
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
while(cin>>m>>n)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
if(map[i][j]=='Y')
{
y.x=i;y.y=j;
}
if(map[i][j]=='M')
{
M.x=i;M.y=j;
}
}
}
bfs(y.x,y.y,v1);
bfs(M.x,M.y,v2);
minn=1000000;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='@'&&v1[i][j]&&v2[i][j])
{
v2[i][j]+=v1[i][j]-2;
if(v2[i][j]<minn)
{
minn=v2[i][j];
}
}
}}
cout<<minn*11<<endl;
}
return 0;
}