【顺丰2018-09-17在线笔试】面包上的芝麻

版权声明:本文为阿木寺的原创文章,未经本人允许不得转载。 https://blog.csdn.net/amusi1994/article/details/82748449

题目描述

在这里插入图片描述

在这里插入图片描述

输入:

10
-691.73,88.01,49.79,-385.15,-875.39,582.77,-881.35,-161.08,142.74,-127.58,729.19,694.82,30.03,-248.93,-246.78,346.60,-625.40,-482.68,893.79,-448.39
5
-109.96,12.34,-25.01,-356.86,-39.88,574.36,661.71,-336.38,346.50,94.99

输出:

(-109.96,12.34) (-25.01,-356.86)

C++代码

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

typedef struct point{
	float x;
	float y;
}POINT;


POINT LPPOINT[100];

bool PtInPolygon(POINT p, vector<POINT> &ptPolygon, int nCount)
{

	// 交点个数  

	int nCross = 0;

	for (int i = 0; i < nCount; i++)
	{
		POINT p1 = ptPolygon[i];
		POINT p2 = ptPolygon[(i + 1) % nCount];// 最后一个点与第一个点连线  

		if (p1.y == p2.y)
			continue;

		if (p.y < min(p1.y, p2.y))
			continue;

		if (p.y >= max(p1.y, p2.y))
			continue;


		// 求交点的x坐标  
		double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;

		// 只统计p1p2与p向右射线的交点  
		if (x > p.x)
		{
			nCross++;
		}
	}

	// 交点为偶数,点在多边形之外  
	return (nCross % 2 == 1);
}


vector<string> split(const string &s, const string &seperator){
	vector<string> result;
	typedef string::size_type string_size;
	string_size i = 0;

	while (i != s.size()){
		//找到字符串中首个不等于分隔符的字母;
		int flag = 0;
		while (i != s.size() && flag == 0){
			flag = 1;
			for (string_size x = 0; x < seperator.size(); ++x)
				if (s[i] == seperator[x]){
					++i;
					flag = 0;
					break;
				}
		}

		//找到又一个分隔符,将两个分隔符之间的字符串取出;
		flag = 0;
		string_size j = i;
		while (j != s.size() && flag == 0){
			for (string_size x = 0; x < seperator.size(); ++x)
				if (s[j] == seperator[x]){
					flag = 1;
					break;
				}
			if (flag == 0)
				++j;
		}
		if (i != j){
			result.push_back(s.substr(i, j - i));
			i = j;
		}
	}
	return result;
}

int main()
{

	int n;
	scanf("%d", &n);
	//cout << n << endl;
	cin.get();	// 释放缓冲区

	string s_vertexs;

	getline(cin, s_vertexs);

	//cout << s_vertexs<<endl;

	vector<POINT> v_vertexs;
	v_vertexs.resize(n);

	vector<string> v = split(s_vertexs, ","); //可按多个字符来分隔;
	/*for (vector<string>::size_type i = 0; i != v.size(); ++i)
		cout << v[i] << endl;*/

	for (int i = 0; i < n; ++i){
		v_vertexs[i].x = atof(v[2*i].c_str());
		v_vertexs[i].y = atof(v[1+2*i].c_str());
	}

	/*for (int i = 0; i < n; ++i){
		cout<< v_vertexs[i].x <<" " <<v_vertexs[i].y<<endl;
	}*/



	// pro2

	int m;
	scanf("%d", &m);
	//cout << n << endl;
	cin.get();	// 释放缓冲区

	string s_search_vertexs;

	getline(cin, s_search_vertexs);

	//cout << s_vertexs<<endl;

	vector<POINT> v_search_vertexs;
	v_search_vertexs.resize(m);

	vector<string> v_s = split(s_search_vertexs, ","); //可按多个字符来分隔;

	for (int i = 0; i < m; ++i){
		v_search_vertexs[i].x = static_cast<float>(atof(v_s[2 * i].c_str()));
		v_search_vertexs[i].y = static_cast<float>(atof(v_s[1 + 2 * i].c_str()));
	}

	// 其实上述输入字符串再分割,确实太麻烦了,建议使用: scanf("(%d,%d,)")的格式

	/*for (int i = 0; i < m; ++i){
		cout << v_search_vertexs[i].x << " " << v_search_vertexs[i].y << endl;
	}*/
	bool flag = false;
	for (int i = 0; i < m;++i)
	{
		if (PtInPolygon(v_search_vertexs[i], v_vertexs, n)){
			//cout << "("<<v_search_vertexs[i].x << "," << v_search_vertexs[i].y <<") ";
			printf("(%.2f,%.2f) ", v_search_vertexs[i].x, v_search_vertexs[i].y);
			flag = true;
		}
	}

	if (!flag){
		cout << "No";
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/amusi1994/article/details/82748449
今日推荐