hiho1092_have lunch together

题目

两个人从同一个点出发,在一个餐厅中寻找两个相邻的座位,需要是的从出发点到达座位的距离总和最短。题目链接: Have Lunch Together
    最短路程,一开始以为要用dijkstra等图算法,发现完全不用,直接用BFS进行搜索,并标记到达每个点的最短距离。一次BFS求出从起始点
到达所有点的最短距离之后,再遍历每个点,判断该点是否是合法的座位(能够从起始点到达,且为座位),然后对每个座位,看它四周的点是否是合法的座位,然
后求出两个合法的座位的最短距离和的最小值。

实现

#include<stdio.h>
#include<cmath>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<deque>
#include<string>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define min(a, b) (a) < (b)? (a) : (b)
char gMap[105][105];
int gMinDist[105][105];
int gMoveStep[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
struct Node {
	int row;
	int col;
	int step;
	Node(int r, int c, int s) :
		row(r), col(c), step(s) {};
};
//BFS 求出从出发点到达每个能够到达的点的最短距离
void Bfs(int start_row, int start_col) {
	queue<Node> Q;
	Node node(start_row, start_col, 0);
	Q.push(node);
	gMinDist[start_row][start_col] = 0;
	while (!Q.empty()) {
		node = Q.front();
		Q.pop();
		for (int i = 0; i < 4; i++) {
			int next_row = node.row + gMoveStep[i][0];
			int next_col = node.col + gMoveStep[i][1];
			if ((gMap[next_row][next_col] == ‘S‘ || gMap[next_row][next_col] == ‘.‘) && gMinDist[next_row][next_col] == -1) {
				gMinDist[next_row][next_col] = node.step + 1;
				if(gMap[next_row][next_col] == ‘.‘)
					Q.push({ next_row, next_col, node.step + 1 });
			}
		}
	}
}
int MinDist(int n, int m) {
	int min_dist = 1 << 29;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (gMap[i][j] == ‘S‘ && gMinDist[i][j] != -1) { // 为一个座位,且在BFS过程中能够到达
				for (int k = 0; k < 4; k++) {
					int ii = i + gMoveStep[k][0];
					int jj = j + gMoveStep[k][1];
					// 为一个座位,且在BFS过程中能够到达
					if (ii >= 1 && ii <= n && jj >= 1 && jj <= m && gMap[ii][jj] == ‘S‘ && gMinDist[ii][jj] != -1) {
						min_dist = min(min_dist, gMinDist[i][j] + gMinDist[ii][jj]);
					}
				}
			}
		}
	}
	return min_dist;
}
int main() {
	int n, m, start_row, start_col;
	scanf("%d %d", &n, &m);
	memset(gMap, ‘#‘, sizeof(gMap));
	memset(gMinDist, -1, sizeof(gMinDist));
	for (int i = 1; i <= n; i++) {
		getchar();
		for (int j = 1; j <= m; j++) {
			scanf("%c", &gMap[i][j]);
			if (gMap[i][j] == ‘H‘) {
				start_row = i;
				start_col = j;
			}
		}
	}
	Bfs(start_row, start_col);
	int min_dist = MinDist(n, m);
	if (min_dist == (1 << 29)) {
		printf("Hi and Ho will not have lunch.\n");
	}else
		printf("%d\n", min_dist);
	return 0;
}
时间: 2024-11-05 15:53:21

hiho1092_have lunch together的相关文章

The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software

The Free Lunch Is Over A Fundamental Turn Toward Concurrency in Software By Herb Sutter The biggest sea change in software development since the OO revolution is knocking at the door, and its name is Concurrency. This article appeared in Dr. Dobb's J

【转载】Free Lunch is Over(免费午餐已经结束了)

原文:Free Lunch is Over(免费午餐已经结束了) 微软C++大师Herb Sutter的文章<The Free Lunch Is Over>翻译,以前自己也经常翻译,但是都不会上传博客.个人很喜欢这篇文章,所以以此作为翻译生涯的开始. 免费的午餐结束了 软件并行计算的基本转折点 继OO之后软件发展的又一重大变革——并行计算 你的免费午餐即将即将结束.我们能做什么?我们又将做什么? 主要的处理器设计生产商,从Intel和AMD到SPARC和PowerPC,已经几乎穷尽了所有的传统

hihoCoder_#1092 Have Lunch Together(最短路)

#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

hdu 4807 Lunch Time

转载自 http://blog.csdn.net/qq564690377/article/details/17100011 题意:在一个有向图当中,现在每一条边带有一个容量,现在有K个人在起点,需要到终点去吃饭,询问这K个人最后一个人到达食堂的最小时间是多少. 想法:联想到普通的网络流,那么我们网络流可以很轻松的求出两个点之间的最大容量是多少,但是现在的问题就是刚开始在起步的时候那么最开始的容量是不可能到达最大的,因为人还在途中,假设我们从时间角度来分析这个问题,再联想到我们网络流求法,费用流当

Android编译详解之lunch命令 【转】

本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程. 如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站:http://source

Android集成一个新产品时,lunch的product name和device name注意事项

Android系统lunch一个当前的Product大概流程包括下面几个部分: 1. lunch确定TARGET_PRODUCT.一般位于vendor/device/build/target/product中的vendorsetup.sh脚本来定义分别有user/eng/userdebug. 2. 开发check product的合理性. 通过载入vendor/device/build/target/product中的AndroidProduct.mk文件,记录其包括的各个.mk文件以及其所在的

Codeforces Gym 100637B B. Lunch 找规律

B. Lunch Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100637/problem/B Description The swamp looks like a narrow lane with length n covered by floating leaves sized 1, numbered from 1 to n with a fly sitting on the top of ea

【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的.另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的. THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排

水题 ZOJ 3875 Lunch Time

题目传送门 1 /* 2 水题:找排序找中间的价格,若有两个,选价格大的: 3 写的是有点搓:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cmath> 9 #include <cstring> 10 #include <string> 11 #include <map> 12 #include <