题目大意:小hi和小ho去咖啡厅喝咖啡,咖啡厅可以看作是n * m的矩阵,每个点要么为空,要么被人、障碍物、椅子所占据,小hi和小ho想要找两个相邻的椅子。起初两个人都在同一个点,求两人到达满足要求的椅子所移动的最少步骤。

思路:先BFS找出每个S到达每个椅子的最短路径长度,然后遍历每一行和每一列找出最优解。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<cstdlib>
#define INF 100000000
using namespace std; int n,m,d[10010],dir[4][2] = {-1,0,1,0,0,-1,0,1};
bool vis[10010];
char ch[110][110];
queue<int>Q; void bfs(int sx,int sy){
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
k = i*m + j;
vis[k] = false;
d[k] = INF;
}
k = sx * m + sy ;
d[k] = 0;
while(!Q.empty())
Q.pop();
Q.push(k);
while(!Q.empty()){
int x = Q.front();
int tx = x/m ;
int ty = x%m ;
Q.pop();
if(vis[x])
continue;
vis[x] = true;
for(i=0;i<4;i++){
int ex = tx + dir[i][0];
int ey = ty + dir[i][1];
if(ex<0 || ex>=n || ey<0 || ey>=m || ch[ex][ey] == '#' || ch[ex][ey] == 'P')
continue;
k = ex*m + ey;
if(vis[k])
continue;
if(ch[ex][ey] == 'S'){
d[k] = d[k] < d[x] + 1 ? d[k] : d[x] + 1;
continue;
}
d[k] = d[k] < d[x] + 1 ? d[k] : d[x] + 1;
Q.push(k);
}
}
} int main(){
int i,j,p1,p2,ans,sx,sy;
bool tag;
while(scanf("%d%d",&n,&m) == 2){
ans = INF;
bool flag = false;
for(i=0;i<n;i++)
scanf("%s",ch[i]);
for(i=0;i<n && !flag;i++)
for(j=0;j<m && !flag;j++)
if(ch[i][j] == 'H'){
sx = i;
sy = j;
flag = true;
} bfs(sx,sy); int t1,t2;
for(i=0;i<n;i++){
p1 = p2 = INF ;
for(j=0;j<m;j++){
if(ch[i][j] == 'S'){
int temp = d[i*m+j];
if(p1 == INF)
p1 = temp;
else if(p2 == INF){
p2 = temp;
ans = ans < p1 + p2 ? ans : p1 + p2 ;
p1 = p2;
p2 = INF ;
}
}
else if(ch[i][j] == 'P' || ch[i][j] == '#' || ch[i][j] == '.'){
p1 = INF ;
p2 = INF ;
}
}
} for(j=0;j<m;j++){
p1 = p2 = INF ;
for(i=0;i<n;i++){
if(ch[i][j] == 'S'){
int temp = d[i*m+j];
if(p1 == INF)
p1 = temp;
else if(p2 == INF){
p2 = temp;
ans = ans < p1 + p2 ? ans : p1 + p2 ;
p1 = p2;
p2 = INF ;
}
}
else if(ch[i][j] == 'P' || ch[i][j] == '#' || ch[i][j] == '.'){
p1 = INF ;
p2 = INF ;
}
}
}
if(ans < INF)
printf("%d\n",ans);
else
printf("Hi and Ho will not have lunch.\n");
}
return 0;
}

hihoCoder 1092 : Have Lunch Together的更多相关文章

  1. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  2. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  3. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  4. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  5. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  6. 【hihoCoder】1148:2月29日

    问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...

  7. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

  8. 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切

      题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词   代码注意点: 1. getline(istre ...

  9. 【hihoCoder】1121:二分图一·二分图判定

      题目   http://hihocoder.com/problemset/problem/1121 无向图上有N个点,两两之间可以有连线,共有M条连线. 如果对所有点进行涂色(白/黑),判定是否存 ...

随机推荐

  1. Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法

    抛错: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document ...

  2. 小米路由器mini搭建个人静态网站的方法

    小米路由和小米路由mini从本质上来说差距就在1T的硬盘上,其它并没有明显差别,但是功能却差很多,例如:小米路由有自带的LAMP模式,而小米路由mini则没有,换句话说,其实这个功能是被阉割了,仔细研 ...

  3. JMeter简单的性能测试实例

    JMeter基础之——一个简单的性能测试 我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站 ...

  4. HDU 3265 Posters(线段树)

    HDU 3265 Posters pid=3265" target="_blank" style="">题目链接 题意:给定一些矩形海报.中间有 ...

  5. ubuntu16.04 server安装小记

    由于本人有一台闲置的thinkpad电脑,所以打算在上边安装一个ubuntu16.04 server版本,其中遇到主要问题,做一下记录: 安装过程中出现“ubuntu16.04 server64 bu ...

  6. Oracle函数function

    --function /* 函数是有返回值.-只能有一个返回值. 语法 Create or replace func1(参数) Return varchar2 As Pl/sql块 Return 'J ...

  7. 简单描述一下XIB与Storyboards,简述它们的优缺点。

    参考答案: 我倾向于纯代码开发,因此所提供的参考答案可能具有一定的个人感情,不过还是给大家说说自己的想法. 优点: XIB:在编译前就提供了可视化界面,可以直接拖控件,也可以直接给控件添加约束,更直观 ...

  8. int.Tryparse() 、int.parse()、Convert.To32() 的区别

    int.Tryparse()  Int32.TryParse(source, result)则无论如何都不抛出异常,只会返回true或false来说明解析是否成功,如果解析失败,调用方将会得到0值. ...

  9. js实现楼层效果

    今天自己写个楼层效果,有一点烦躁,小地方犯错误.各位大神来修改不足啊!!! <!DOCTYPE html><html lang="en"><head& ...

  10. js的水仙花数的输出

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...