#1092 : Have Lunch Together

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

Everyday Littile Hi and Little Ho meet in the school cafeteria to have lunch together. The cafeteria is often so crowded that two adjacent seats are hard to find.

School cafeteria can be considered as a matrix of N*M blocks. Each block can be empty or occupied by people, obstructions and seats. Little Hi and Little Ho starts from the same block. They need to find two adjacent seats(two seats are adjacent if and only if their blocks share a common edge) without passing through occupied blocks. Further more, they want the total distance to the seats is minimal.

Little Hi and Little Ho can move in 4 directions (up, down, left, right) and they can not move outside the matrix.

输入

Input cantains a single testcase.

First line contains two integers N, M, the length and width of school cafeteria.

The next is a matrix consists of N lines, each line containing M characters. Each character describe a block: '.' for empty block, 'P' for people, '#' for obstructions, 'S' for seats and 'H' for Little Hi and Little Ho's starting position.

10 <= N, M <= 100

输出

Output the minimal distance they need to move to reach two adjacent seats. If no such adjacent seats output a line "Hi and Ho will not have lunch." without quotes.

样例输入

10 10
##########
#...P##..#
#S#...#.P#
#S#..#...#
#...#.####
#.#...#.H#
##......##
#..P#..S.#
##.......#
##########
样例输出
25

看到题目,第一个想法竟然是从H开始找到两个S的最短路径,dfs递归,然后找两个S的最短路径的时候怎么写都感觉不对,后来逆向思维,那么我从两个S去找H的最短路径不就好找了么,还有一个问题这个最短路径要怎么找,一开始写了个递归算法,结果超时了,后来想到某个点的最短路径bfs也可以了。

现在写一下步骤:

1.找到两个挨着的S

2.找到每个S到H的最短距离(这里采用广度优先遍历,此处注意已经遍历过得不要再遍历)

import java.util.*;
public class HaveLunch {public static int MAX=20005;public static int sum=MAX;public static int dis=MAX;//设置好四个方向public static int[][] mark={{1,0},{-1,0},{0,1},{0,-1}};public static void main(String args[]){Scanner in=new Scanner(System.in);while(in.hasNextLine()){String[] line=in.nextLine().split(" ");int n=Integer.valueOf(line[0]);int m=Integer.valueOf(line[1]);char[][] map=new char[n][m];for(int i=0;i<n;i++){map[i]=in.nextLine().toCharArray();}sum=MAX;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(map[i][j]=='S'){for(int k=0;k<4;k++){int tx=i+mark[k][0];int ty=j+mark[k][1];if(tx<0||tx>=n) continue;if(ty<0||ty>=m) continue;if(map[tx][ty]=='S'){dis=MAX;//采用广度优先遍历的方式寻找到达H点的最短路径bfs(map,i,j,n,m);int dis1=dis;dis=MAX;bfs(map,tx,ty,n,m);int dis2=dis;if(dis1!=-1&&dis2!=-1&&dis1+dis2<sum){sum=dis1+dis2;}}}}}}if(sum==MAX){System.out.println("Hi and Ho will not have lunch.");}else{System.out.println(sum);}}}public static void  bfs(char[][] map,int x,int y,int n,int m){Queue<Node> queue=new LinkedList<Node>() ;boolean[][] dp=new boolean[n][m];Node node=new Node(x,y);node.step=0;queue.add(node);dp[x][y]=true;//利用队列来实现类似于图的广度优先遍历while(!queue.isEmpty()){Node pre=queue.poll();int a=pre.x;int b=pre.y;if(map[a][b]=='H') {dis=pre.step;break;}for(int k=0;k<4;k++){int curx=a+mark[k][0];int cury=b+mark[k][1];if((!dp[curx][cury])&&judge(curx,cury,map,n,m)){Node cur=new Node(curx,cury);cur.step=pre.step+1;//找到H节点就可以返回了if(map[curx][cury]=='H'){dis=cur.step;return;}//每个放入的节点都要设置为遍历过dp[curx][cury]=true;queue.add(cur);}}}}public static boolean judge(int x,int y,char[][] map,int n,int m){if(x<0||x>=n) return false;if(y<0||y>=m) return false;if(map[x][y]=='P'||map[x][y]=='S'||map[x][y]=='#') return false;return true;}public static class Node{int x;int y;int step;Node(int x,int y){this.x=x;this.y=y;}}
}

微软校招笔试题#1092 : Have Lunch Together详解以及源码分析相关推荐

  1. HashMap、ConcurretnHashMap面试题详解,源码分析

    文章目录 面试题 HashMap.LinkedHashMap和TreeMap的区别是什么? ①:为什么hashmap每次扩容大小为2的n次方? ③:jdk1.7的hashmap的扩容操作是在元素插入之 ...

  2. 2014 微软校招笔试题以及答案(求指正)

    校招题目链接: http://blog.csdn.net/xiaoerlyl/article/details/12126807 参考答案:(仅供参考,待修正) 1. BD 线程可以共享主进程的内存空间 ...

  3. 2016微软校招笔试题

    标题 A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. ...

  4. 数据分析真题日刷 | 欢聚时代2018校招笔试题-产品经理/数据分析/游戏运营/市场专员 A卷

    今日真题 欢聚时代2018校招笔试题-产品经理/数据分析/游戏运营/市场专员 A卷(来源:牛客网) 题型 客观题:单选5道,不定项选择10道 主观题:问答4道 完成时间 90分钟 牛客网评估难度系数 ...

  5. 九月十月 阿里 百度 华为 校招笔试题

    九月迅雷,华为,阿里巴巴,最新笔试面试十题 8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面 ...

  6. 关于python类的继承正确的说法是_2017美团点评的运维岗校招笔试题,测测你会几题?...

    原标题:2017美团点评的运维岗校招笔试题,测测你会几题? 1.数据库:以下哪项不是HASH索引的特征? A MySQL不能确定在两个值之间大约有多少行 B 不能使用hash索引来加速ORDER BY ...

  7. 【美团校招笔试题】去除字符串首尾空格,中间多个空格只保留一个

    要求: 这是本人参加美团校招在线考试笔试题,如果此行为违反了美团校招笔试题商业保密性,请与本人联系. 思路:用一个while循环扫描整个字符串,用pStart字符指针指向整个字符串首地址,如果遇到首部 ...

  8. 小米运维部14年校招笔试题A的个人答案

    15年准备实习生面试时答的题,仅供参考 具体题目详见  http://www.tuicool.com/articles/eYRZBr http://noops.me/?p=1154 一.linux基础 ...

  9. 剑指Offer——腾讯+360+搜狗校招笔试题+知识点总结

    剑指Offer--腾讯+360+搜狗校招笔试题+知识点总结 9.11晚7:00,腾讯笔试.选择题与编程.设计题单独计时. 栈是不是顺序存储的线性结构啊? 首先弄明白两个概念:存储结构和逻辑结构. 数据 ...

最新文章

  1. 五行代码玩转GPT-2,新加坡高中生开源轻量级GPT-2“客户端”
  2. 在centos7升级nodejs
  3. 方向梯度直方图(Histogram Of Gradient)详解
  4. 真的汉子不多,褚时健褚老算一个
  5. c3074 无法使用带圆括号的_地埋警示带预防挖掘 石油管道警示带保护管道安全...
  6. C语言中怎么将变量名转换为字符串 -转
  7. maccms代码审计——前台sql注入漏洞
  8. python中将字符变为大写_python如何把小写字母变成大写字母
  9. openGauss数据库安全指导手册
  10. noip使用主机动态DNS解析
  11. vue图片加载不出来的问题
  12. Ubuntu下如何使用编译使用john-1.9.0源码
  13. 基于SpringBoot的共享汽车管理系统
  14. 软件工程课程周进度报告 第六周
  15. Oracle收款核销了怎么撤销,21应收收款-核销取消或核销调整
  16. 树莓派安装基于python的opencv
  17. Spark Core快速入门系列(5) | RDD 中函数的传递
  18. 一休哥的PowerBI学习之路-可控的视觉筛选器
  19. 三一重机“一天内解决”服务标准背后,百度智能云守护“中国速度”
  20. 阻止迅雷播放器暂停广告

热门文章

  1. BZOJ 1038 瞭望塔(半平面交)
  2. [P2600][ZJOI2008]瞭望塔(半平面交)
  3. 一图让你快速弄懂客户端渲染(CSR)与服务端渲染(SSR)
  4. 内存泄漏检测(C++)
  5. 关于论坛发帖图片不显示之解决策略
  6. VSC配置C C++
  7. AddressSanitizer使用介绍
  8. 2016第四套人民币荧光币价格表一览
  9. 苹果osx系统切换中文
  10. [python]数据整理,将取得的众多的沪深龙虎榜数据整一整