wap 机试(lsp) 问题 暴力法

#include <iostream>
#include <queue>
#include <assert.h>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;

const int dx[] = { -1 , 0 , 0, 1};
const int dy[] = { 0 ,-1 ,1 , 0 }; //4 direction

struct Point{
	Point(){};
	Point(int x,int y):m_x(x),m_y(y){}
	int m_x;
	int m_y;
	bool operator == (const Point & rPoint ){
		return rPoint.m_x == m_x && rPoint.m_y == m_y;
	}
};

class Orienteering{
public:
	int main();
	bool isValid(const Point & p){
		bool ans = p.m_x >=0 && p.m_x < cMap.size() && p.m_y >= 0 && p.m_y < cMap[0].size() && cMap[p.m_x][p.m_y] != '#' ;
		return ans;
	}
	bool findG(const Point &cPoint,const Point &ePoint){
		for(int i = 0 ; i < 4 ; i ++ ){
			Point p(cPoint.m_x + dx[i] , cPoint.m_y + dy[i]);
			if(isValid(p) && !bVisited[p.m_x][p.m_y] && p == ePoint){
				return true;  // 只考虑一个
			}
			if(isValid(p) && ! bVisited[p.m_x][p.m_y]){
				Qtemp.push(p);
				bVisited[p.m_x][p.m_y] = true;
			}
		}
		return false;
	}
	void ClearQueue(queue<Point> &Q){
		while(!Q.empty()){
			Q.pop();
		}
	}

	void ResetVisted(){
		for(int i = 0 ; i < bVisited.size() ; i ++)
			for(int j = 0 ; j < bVisited[0].size() ; j ++ )
				bVisited[i][j] = false;
	}

	int findShortest(const Point & sPoint,const Point &ePoint){
		ResetVisted();
		ClearQueue(Qin);
		ClearQueue(Qtemp);

		shortestCount = 0;

		Qin.push(sPoint);
		bVisited[sPoint.m_x][sPoint.m_y] = true;
		while (true){
			while(!Qin.empty()){
				Point cur = Qin.front();
				if(findG(cur,ePoint)){
					shortestCount += 1;
					return shortestCount;
				}
				Qin.pop();
			}
			if(Qtemp.empty())
				return -1;// no way to
			else{
				shortestCount += 1;
				swap(Qtemp,Qin);
			}
		}
		return -1;
	}

	void permutation(vector<vector<int>> & perms,int *a,int n,int k)
	{
		if(k == n){
			vector<int> temp(a,a+n);
			perms.push_back(temp);
			return;
		}
		for(int i = k; i < n ; i ++ ){
			swap(a[i],a[k]);
			permutation(perms,a,n,k+1);
			swap(a[i],a[k]);
		}

	}

	void readFile(string & filePath,vector<string> &cMpas){
		ifstream in(filePath);
		if(!in.is_open())
			return;
		string line;
		getline(in,line);
		sscanf(line.c_str(),"%d %d",&m,&n);
		for(int i = 0 ; i < m ; i ++ ){

			getline(in,line);
			cMpas.emplace_back(line);
		}
	}

	int m,n;
	int shortestCount;
	vector<vector<bool>> bVisited;
	queue<Point> Qin;
	queue<Point> Qtemp;
	vector<string> cMap;
};

int Orienteering::main(){
	/*
	int mapBackup[M][N];
	memcpy(mapBackup,path,sizeof(path)/sizeof(int));*/
	string filePath = "example1.txt";
	readFile(filePath,cMap);
	bVisited.resize(m,vector<bool>(n,false));

	vector<Point> ats;
	Point pStart;
	Point pEnd;

	for(int i = 0 ; i < m ; i ++ ){
		for(int j = 0 ; j < n ; j ++ ){
			if(cMap[i][j] == '@')
				ats.push_back(Point(i,j));
			if(cMap[i][j] == 'S')
				pStart = Point(i,j);
			if(cMap[i][j] == 'G')
				pEnd = Point(i,j);
		}
	}
	int gNums = ats.size();
	int *arrayNums = new int[gNums];
	for(int i = 0 ; i < gNums ; ++ i)
		arrayNums[i] = i;
	vector<vector<int>> perms;
	permutation(perms,arrayNums,gNums,0);
	int minLen = 100000;
	for(int i = 0 ; i < perms.size() ; i ++ ){
		int totalLen = 0;
		Point endP = ats[perms[i][0]];
		int len = findShortest(pStart,endP);
		if(len ==-1)
			return -1;
		totalLen += len;
		for(int j = 0 ; j < perms[i].size() -1 ; j ++ )
		{
			Point startPoint = ats[perms[i][j]];
			Point endPoint = ats[perms[i][j + 1]];
			int len = findShortest(startPoint,endPoint);
			if(len == -1)
				return -1;
			totalLen += len;
		}
		len = findShortest(ats[perms[i][perms[i].size()-1]],pEnd);
		if(len == -1)
			return -1;
		totalLen += len;
		minLen = min(totalLen,minLen);
	}
	delete[] arrayNums;
	return minLen;
}

int main(){
	Orienteering o;
	int ans = o.main();
	system("pause");
	return 0;
}

时间: 2024-10-08 18:23:22

wap 机试(lsp) 问题 暴力法的相关文章

大整数相乘“分治法”和“循环暴力法”

前言 今天刷到一道很有趣的面试题,感觉很有意思,来分享给大家. 题目描述 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述:空格分隔的两个字符串,代表输入的两个大整数输出描述:输入的乘积,用字符串表示 示例1 输入72106547548473106236 982161082972751393输出70820244829634538040848656466105986748 思路分析 例如x=1234,y=567 ①将x拆分成两半儿,a =

华为OJ机试训练(一)

题目1 -- 通过输入英文句子.将每一个单词反过来,标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? 比如输入:Hello, I need an apple. 输出: /** * 华为机试训练1: 通过输入英文句子,将每一个单词反过来.标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? * Hello, I need an apple. * * @author snail * */ public class Mai

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

华为机试ACM(字符组合问题)

今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数,当N=0或者N>M时,输出“ERROR”. 思路:可以用递归的算法解决,例如ABC中2个字符的所有组合,先选取第一个的A,那包含A的2个字符的所有组合就是从后面剩余的BC中取1个字符的所有组合,然后选取第二个的B,那包含B的2个字符的所有组合就是从后面剩余的C中取1个字符的组合,即只有C,到选取第

2014年七月华为校招机试题目--最难的一道, 呵呵!

今天百无聊赖之时, 漫心看到14年的华为校招机试题目, 一共三道, 前两道皆是平平, 第三道却柳暗花明, 让人眼前一亮. 咋一看, 饶有趣味, 看似平淡无奇, 然而却玄机颇深(对我这种弱渣而言).(不过对于ACMer, 好像应该用基础算法, 就能解决!) (然而我也只会基础的算法!!忏愧的紧!!!).如果有幸被大神看到, 能指点我一两招, 不胜感激!  下面是题目和我的详细题解思路(可供巨巨一笑!嘿嘿!). 2014年七月华为校招机试题目: 第三题: 输入一个正整数X,在下面的等式左边的数字之间

【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助. 2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格.“朱兆祺STM32手记”(http://bb

华为机试 宝典3 —擂台实战

首先推荐一个网站:acm.xidian.edu.cn/land/,上面的很多题目,难度很适合机试,如: 很简单:1031,1120,1122,1121,1103,1104,1281, 简单:1049,1181,1182,1279,1280, 中等:1106,1108,1183,1288. 难:1105,1282,1283, 大家可以根据自己的水平去训练,其实里面的难题也是很简单的,归类到题库中的话都属于简单题,只要好好看书学习都是可以做出来的,下面放几道例题,这些题都是机试很有可能考的题目,或者