hihoCoder 1092 : Have Lunch Together
题目大意:小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的更多相关文章
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II
http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...
- 【hihoCoder】1288 : Font Size
题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...
- 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切
题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词 代码注意点: 1. getline(istre ...
- 【hihoCoder】1121:二分图一·二分图判定
题目 http://hihocoder.com/problemset/problem/1121 无向图上有N个点,两两之间可以有连线,共有M条连线. 如果对所有点进行涂色(白/黑),判定是否存 ...
随机推荐
- cf492B Vanya and Lanterns
B. Vanya and Lanterns time limit per test 1 second memory limit per test 256 megabytes input standar ...
- samsungGalaxyS4USB驱动
http://www.samsung.com/cn/support/usefulsoftware/KIES/JSP
- phpcms:八、show.html
标题:{$title}来源:{$copyfrom}评论:<a href="#comment_iframe" id="comment">0</a ...
- java基础 二分查找算法
/* * 折半查找法: * 思路: * 定义三个变量记录查找范围中最大.最小和中间的索引值,每次都是使用中间索引值与要查找的目标进行对比,如果不符合,那么就不停缩小查找范围 * */ ...
- Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表
在接下来的教程中,我们将实现一个简单的JasperReports示例,展现其基本的开发.使用流程.文章很长,不过是以图片居多,文字并不多. 实例中使用最新的Jasper Studio5.2进行报表设计 ...
- JSP实现分页功能
分页须知知识点: (1)JDBC2.0的可滚动结果集. (2)HTTP GET请求. 一.可滚动结果集 Connection con = DriverManager.getConnection( ...
- How to build UDK2015?
UDK2015 is a stable release of portions of the EDKII project. 本文记录在Win7下用VS2012 编译UDK2015的过程. Step1, ...
- javascript紧接上一张for循环的问题,我自己的理解
这类问题,通常都是在for循环里,根据i的变化作为dom的下标来作当前dom的点击事件, 预期是,每个点击事件都对应相应的i下标,但是问题是,每次点击的都是最后一次节点的dom. 原因就是其实我们作点 ...
- html与css的移动端与pc端需要注意的事项
一个移动端与pc端之间最主要的也就是尺寸问题,苹果与安卓的机型尺寸大小相差甚多,一个尺寸都会影响用户的体验.那么我们来了解一下一些常用的解决方法. 一般在网页中都会在头部有一些这样的代码 <me ...
- 《第一行代码》学习笔记9-活动Activity(7)
1.发现Android中的活动是可以层叠的,每启动一个新的活动,就会覆盖在原活动之上, 然后点击Back键会销毁最上面的活动,下面的一个活动就会重新显示出来. 2.Android是使用任务来管理活动的 ...