题目大意:小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. c语言结构体5之匿名结构体

    注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...

  2. <php>删除(有内容的)文件夹函数程序

    function deldir($dirname) { if(!file_exists($dirname)) {//判断文件夹是否存在 die("文件夹不存在!");//作用等于( ...

  3. Android Support库百分比布局

    之前写过一篇屏幕适配的文章Android 屏幕适配最佳实践,里面提到了类似百分比布局的东西,可是该方法缺点非常明显,就会添加非常多没用的数据,导致apk包变大. 而谷歌的support库中,添加了一个 ...

  4. iOS中的界面多选功能--(UICollectionView)

    文/Jacob_Pan(简书作者)原文链接:http://www.jianshu.com/p/9d28ebd0f5a2著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近做项目接触了一 ...

  5. Java第四周学习日记(绪)

    1.静态导入 作用:简化书写静态导入可以作用一个类的所有静态成员静态导入格式:import static 包名.类名静态导入要注意的事项:如果静态导入的成员与本类的成员存在同名的情况下,那么默认使用本 ...

  6. samba后台进程及安全模式简介

    识别 Samba 后台程序Linux 服务器通常作为守护程序(daemon) 来实现,这一词源于希腊神话,其中守护神(daemon)是超自然生物.Linux 守护程序在后台运行以便执行一些有用的任务. ...

  7. CentOS CVS安装使用

    CentOS CVS安装使用   一.CVS简介 CVS(Concurrent Versions System)版本控制系统:是一种GNU软件包,CVS是一个C/S系统,主要用于在多人开发环境下的源码 ...

  8. Java 日期与字符串的转换

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public cl ...

  9. Oracle异常的抛出处理

    --一异常处理的代码 --sqlcode 异常编号 --sqlerrm 信号字符串 /* 在plsql 块中格式 Declare 变量 Begin 代码块 EXCEPTION when 异常的名称 t ...

  10. 5 HBase 常用Shell命令

    进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成 ...