2014WAP校园招聘笔试题

Works Application面试总结 2015年秋Works Application面试总结 阅读详情

这是2014年WAP笔试的第一题,当时没有做出了,最近在网上看到一篇博客写了关于这道题的解法,自己看了看用C++实现了。博客地址:http://blog.youkuaiyun.com/litoupu/article/details/41220817

题目:

Abstract
We are planning an orienteering game.
The aim of this game is to arrive at the goal (G) from the start (S) with the shortest distance.
However, the players have to pass all the checkpoints (@) on the map.
An orienteering map is to be given in the following format.
########
#@....G#
##.##@##
#..@..S#
#@.....#
########
In this problem, an orienteering map is to be given.
Calculate the minimum distance from the start to the goal with passing all the checkpoints.
Specification
* A map consists of 5 characters as following.
You can assume that the map does not contain any invalid characters and
the map has exactly one start symbol 'S' and exactly one goal symbol 'G'.
* 'S' means the orienteering start.
* 'G' means the orienteering goal.
* '@' means an orienteering checkpoint.
* '.' means an opened-block that players can pass.
* '#' means a closed-block that players cannot pass.
* It is allowed to move only by one step vertically or horizontally (up, down, left, or right) to the
next block.
Other types of movements, such as moving diagonally (left up, right up, left down and right down)
and skipping one or more blocks, are NOT permitted.
* You MUST NOT get out of the map.
* Distance is to be defined as the number of movements to the different blocks.
* You CAN pass opened-blocks, checkpoints, the start, and the goal more than once if necessary.
* You can assume that parameters satisfy following conditions.
* 1 <= width <= 100
* 1 <= height <= 100
* The maximum number of checkpoints is 18.
* Return -1 if given arguments do not satisfy specifications, or players cannot arrive at the goal

from the start by passing all the checkpoints.



解题思路:

本题是一道动态规划问题,问题的难点在于如何存储中间子问题的结果,比如这道题是求从起点S经过所有的@到达终点G求其最短路径,以题目中的例子为例:S编号为0, G编号为5,其他@节点从上到下从左到右依次编号为1,2,3,4,我们求到达G的最短路径我们可以分解为是从1到达还是从2,3,4到达G这样就转换成求解到达1,2,3,4四个较小的子问题,依次类推把问题不断缩小。这里有一个问题就是到达某个checkpoints  i 不是仅仅的求其从起点S到达此i的最短路径而是要经过除其后路径上的@的节点所有@节点,比如我们是从4到达G的但是从S到达4有好多种方法如S-1-2-3,S-1-3-2,S-2-1-3...等等他们又可以分为许多更小的子问题,为了不重复计算需要把这些中间结果都存储下来,这么在以后的计算中快速判断和找到这个子问题是否已经计算过了呢?参考的博客中使用 位 很好的解决了这个问题,比如本例中有四个checkpoints那么我们就用四位二进制来表示:XXXX,(X取0或1)分别代表第四个第二个第三个第一个checkpoint,0101表示到达指定的节点需要经过第三个和第一个节点,1001表示到达指定节点需要经过第一个和第四个节点。以下代码中slove(G,1111)表示从起点S经过四个chekpoints到达G的最短路径。

代码:


#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cmath>

using namespace std;

const int MAX_VAL = 1000000000;//不可达 
//到达目的的路径个数的上限值 ,这个值取多大取决于从S经过所有的@到达G有多少条不同的路径(全排列)
const int LEN = 524288; 
const int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};//搜索的四个方向 

struct node
{
	int r;
	int c;
	int step;
};

char ori_map[102][102];//地图 
unsigned int index[102][102];//给起点S,终点G以及每一个checkpoints节点分配一个索引0,1,2.... 
bool isVisited[102][102];//记录是否走过这个节点 
int width, height;
int checkpoints = 0;//记录checkpoints个数 
int S_R, S_C, G_R, G_C;//起点和终点的行列坐标 

int minDistance[20][20];//任意S,G或@节点之间的最小距离
//state[i][j]中j转化为二进制表示每一位代表一个checkpoint节点,
//若是1就代表到达i节点必须要走这个节点 ,比如j = 0101b就表示到达i要经过第一个和第三个checkpoint 
int state[20][LEN];

void bfs(node start)
{
	memset(isVisited, false, sizeof(isVisited));
	queue<node> q;
	q.push(start);
	
	while(!q.empty())
	{
		node first = q.front();
		q.pop();
		int r = first.r;
		int c = first.c;
		int step = first.step;
		isVisited[r][c] = true;
		for(int i=0;i<4; ++i)
		{
			int nextr = r + dir[i][0];
			int nextc = c + dir[i][1];
			if(nextr>=0&&nextr<height
			   &&nextc>=0&&nextc<width
			   &&isVisited[nextr][nextc]==false
			   &&ori_map[nextr][nextc]!='#')
			{
				isVisited[nextr][nextc] = true;
				node tmp;
				tmp.r = nextr;
				tmp.c = nextc;
				tmp.step = step + 1;
				q.push(tmp);
				//if('S'==ori_map[nextr][nextc]||'G'==ori_map[nextr][nextc]||'@'==ori_map[nextr][nextc])
				if('.'!=ori_map[nextr][nextc])
				{
					minDistance[index[start.r][start.c]][index[nextr][nextc]] = step + 1;
				}
			}
		}
	}
}

void getminDistance()
{
	for(int i=0; i<height; ++i)
	{
		for(int j=0; j<width; ++j)
		{
			if('S'==ori_map[i][j] || 'G'==ori_map[i][j] || '@'==ori_map[i][j])
			{
				node tmp;
				tmp.r = i;
				tmp.c = j;
				tmp.step = 0;
				bfs(tmp);
			}
		}
	}
}

int slove(int k, int s)
{
	if(state[k][s]>0&&state[k][s]<MAX_VAL)
	{
		return state[k][s];
	}
	int ans = MAX_VAL;
	for(int i=1; i<checkpoints+2; ++i)
	{
		if((s & (1<<(i-1)))!=0)
		{
			int subSlove = slove(i, s^(1<<(i-1)));
			if(subSlove!=MAX_VAL && minDistance[i][k]!=MAX_VAL)
			{
				int subAns = subSlove + minDistance[i][k];
				if(subAns<ans)
				{
					ans = subAns;
				}
			}
		}
	}
	
	state[k][s] = ans;
	return ans;
}

int main()
{
	cin>>width>>height;
	for(int i=0;i<height;i++)
	{
		for(int j=0;j<width;++j)
		{
			cin>>ori_map[i][j];
			switch(ori_map[i][j])
			{
				case 'S':
					S_R = i;
					S_C = j;
					index[i][j] = 0;
					break;
				case 'G':
					G_R = i;
					G_C = j;
					break;
				case '@':
					++checkpoints;
					index[i][j] = checkpoints;
					break;
			}
		}
	}
	
	index[G_R][G_C] = checkpoints+1;
	
	for(int i=0; i<checkpoints+1; ++i)
	{
		minDistance[i][i] = 0;
		for(int j=i+1; j<checkpoints+2; ++j)
		{
			minDistance[i][j] = MAX_VAL;
			minDistance[j][i] = MAX_VAL;
		}
	}
	
	getminDistance();
	
	for(int i=1; i<checkpoints+2; ++i)
	{
		state[i][0] = minDistance[i][0];
	}
	
	int end_state = (1<<checkpoints) - 1;;
	int len = slove(checkpoints+1, end_state);
	
	if(MAX_VAL == len)
	{
		cout << -1 << endl;
	}
	else
	{
		cout << len << endl;
	}
	
	return 0;
}

为题目中的例子附加张图来帮助理解代码中slove的递归操作吧:


OpenCV图像分割cv::grabCut()函数 函数:void grabCut( InputArray img, InputOutputArray mask, Rect rect,                            InputOutputArray bgdModel, InputOutputArray fgdModel,                            int iterCount, int mo 阅读详情

相关推荐

windows程序设计中MM_TEXT模式下的逻辑坐标与设备坐标的转换

在windows程序设计中,MM_TEXT模式下逻辑坐标和设备坐标原点默认是(0 , 0) ,在客户区左上角。x轴从左到右增加,y轴从上到下增加。当使用SetViewportOrgEx() 和 SetWinodwOrgEX()函数修改设备坐标系和窗口(逻辑)坐标系时,我们该怎么简单的找到逻辑坐标系点(0 , 0 )在变换后的位置,一种简单的方法是移动逻辑坐标系原点去和设备坐标系原点重合(注意:不管

知行且执行 2708

WAP2017春招笔试题

笔者非计算机专业,小白一枚,博客记录一下日常做的算法题,未参加WAP笔试,题目由群友提供。 思路: 使用动态规划+map 以下是代码: #include #include #include #include using namespace std; class solution{ public: bool pre_exist(int max_left,int

chaoji81的博客 1541

WAP 2013年笔试题(区间相关)

本资源是WAP公司2013年的笔试题,涉及的题目是关于区间调度的。

WAP校招笔试

Abstract We are planning an orienteering game. The aim of this game is to arrive at the goal (G) from the start (S) with the shortest distance. However, the players have to pass all the checkpoints

u013268685的专栏(有一种幸福叫AC,有一种期待叫AK) 3027

泛微OA E9文档管理优化:临时文件清理与存储配置指南

本文深入解析了泛微OA E9系统性能下降的常见原因——临时文件堆积,并提供了完整的优化配置指南。文章详细介绍了临时文件的产生机制,并手把手指导管理员如何通过修改存储路径、调整保留时间、设置白名单等关键配置,有效清理与管理系统临时文件,从而释放存储空间,提升系统运行效率与稳定性。

tree8的博客 432

LangChain + Milvus Lite:从零搭建本地RAG知识库

本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。

weixin_29044713的博客 445

2019WAP初试笔试题目

初试一共两道题目,做答时间2小时 第一题:给定n个公交站,m条线路,假设每条线路坐车的价格均是1元,求从站点1到站点n所花的最少钱。(保证站点1到站点n一定有路径) 每条线路均是1元,求最小花费,本质上就是求公交线路最少换乘数+1。 输入:       第一行:n,m       第二行-第m+1行 线路站点数,线路从第一个站点到最后一个站点 输出:       最少的花费 案例输...

aoxue_bai的博客 729

Supervisor 安装与使用

一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客...

疯子丶pony的博客 3864

WAP笔试题

Wireless Routers WAP exam

jlin991的博客 1307

Win11+VSCode+TeXLive:学术党必备的LaTeX环境配置避坑指南(2024最新版)

本文详细介绍了如何在Windows 11系统下,通过VSCode编辑器与TeXLive发行版配置高效的LaTeX学术写作环境。针对国内用户常见的镜像下载慢、插件配置复杂等问题,提供了优化方案和避坑指南,帮助科研人员和学生快速搭建流畅的学术写作工作流。

plum99的博客 623

Trae 在代码审查场景的 3 大差异化能力:对比 Claude Code、Cursor 与 Codex 实测

揭示代码审查的核心矛盾是上下文断层而非找 Bug,介绍 Trae 通过跨文件符号追踪、意图-实现对齐校验、增量变更影响图谱生成三件事实现上下文校准,并对比其与 Claude Code、Cursor、Codex 在多模块 Java 项目中的实际审查差异

weixin_42525482的博客 152

2014 WAP校园招聘笔试题

 2014 WAP校园招聘笔试题 Problem's Link:   http://www.doc88.com/p-6751117015483.html   WAP公司笔试题 We are planning an orienteering game. The aim of this game is to arrive at the goal (G) from the start (S...

weixin_34161032的博客 78

【20】方案管理器

方案管理器是Excel中一个非常强大且灵活的工具,适合用于多情景分析和比较。在复杂的决策过程中,它可以帮助用户快速管理和评估不同变量组合下的结果,从而优化决策过程。

学习,输出==》再学习再输出 1587

2014 WAP校园招聘笔试题1

Abstract We are planning an orienteering game. The aim of this game is to arrive at the goal (G) from the start (S) with the shortest distance. However, the players have to pass all the checkpoints

csf的专栏 2775

YOLO26涨点改进 | NeurIPS2025最佳论文!注意力改进篇| 引入Gated Attention门控注意力模块、太牛了!直接拯救了大模型的发展,助力目标检测、图像分割、图像分类有效涨点

本文提出了一种基于门控注意力机制(GatedAttention)的YOLO26模型改进方法。该方法在标准softmax注意力机制中引入头部特定的sigmoid门控,通过增强注意力机制使模型更聚焦于关键信息。实验表明,该模块能显著提升模型性能,特别是在复杂背景和密集目标场景中,同时减少无关区域关注并提高检测精度。门控机制引入的非线性和稀疏性不仅提升了推理效率,还改善了训练稳定性,使模型能采用更大学习率并增强扩展性。此外,该方法有效缓解了"注意力下沉"现象,增强了模型对长距离目标的感知能力。

Ai缝合怪、助力小伙伴高效发论文 657

手把手教你学Simulink——基于Simulink的CLLC谐振变换器双向对称控制

本文介绍了一种基于Simulink的CLLC谐振变换器双向对称控制方法。针对CLLC拓扑的多阶谐振特性,采用固定频率、50%占空比、仅调节相位差的对称控制策略,实现了宽电压范围调节和全负载ZVS软开关。详细阐述了Simulink建模步骤,包括功率级搭建、相位差生成逻辑和双向切换实现,并通过仿真验证了稳态性能和双向无缝切换能力。该方法解决了传统PFM控制的不足,具有控制简单、效率高、易于工程实现的优势,适用于车载充电和储能系统等双向功率应用场景。

MHD0815的博客 302

58同城

58同城求职干货目录•1. 公司介绍 •1.1 58同城概况 •1.2 58同城历史 •1.3 58同城主营业务/品牌 • 1.4 58同城文化/价值观 •2. 校招介绍 •2.1 58同城2014校园招聘介绍 •2.2 58同城校园招聘流程 •3. HR答疑 •3.1 58同城校园招聘FAQ •4. 薪酬待遇 •4.1 58同城职业发展 •4.2 58同城薪酬待遇 •5. 笔试...

weixin_33918357的博客 1389

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

WAP面经 live coding

WAP面试归来本人某985小硕,记得当时宣讲会来学校宣讲,开出的薪酬十分惊人,高出BAT不少,我就跃跃欲试了。 WAP的招聘流程是 首先,完成他给的笔试题,3days内完成其中一道即可 然后是live coding面试 HR面据说不卡人 最后是传说中的INTERNSHIP 今年改成5天了 笔试题目基本上是不能在网上查到的,而且不同地区好像也不一样。有两题,一道是魔方,一道是wireless ro

jlin991的博客 1997

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

雷德算法

使用雷德算法实现倒位序:         对于自然顺序(二进制)我们是在低位加 1 得到下一位数,对于倒位序我们是在高位加 1 向低位进位。比如已知一个倒位序数是J求其下一个倒位序数,N位总数 ,把J与N/2比较若J=N/2则说明J的最高位为1 ,把最高位置0 ,比较次高位,若次高位为0 ,则把次高位置1,得到J的下一个倒位序,若次高位为1  , 则把次高位置0,以此类推... 以N = 8

知行且执行 5115

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VS2012中CSting , std::string , char * 之间的转换

首先,设置“项目属性”-“配置属性”-“常规”-“字符集”设置为使用“使用多字节字符集” 1、从CSting到std::string std::string str ; CString cstr ; str = cstr.GetBuffer() ; 2、从std::string到CString std::string str("test") ; CString cstr ; cst

知行且执行 3827

C++中string使用

所有解释已经在程序中标明,不再单独解释 代码: //如何使用C++标准库类型中的string #include #include #include using namespace std; int main() { //1、构造函数 cout << "***********************string类的构造函数***********************" << en

知行且执行 2960

C++中vector和set删除一亿个数字中的奇数

一、vector 先贴代码再解释: #include #include #include #include using namespace std; const unsigned int NUM = 100000000; void removeOdd1(vector& a) { for(vector::iterator it = a.begin();it!=a.end();)

知行且执行 2286
上一篇: 2015小米在线笔试题
下一篇: HDU1232 畅通工程
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值