gpt4 book ai didi

c++ - 检索结构中最接近的 X 和 Y 的函数?

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:15 26 4
gpt4 key购买 nike

文本文件

[0]
total=0

[10000]
total=3
-593 427 683
-976 703 701
-974 307 688

[20000]
total=0

[30000]
total=1
197 -83 153

[30001]
total=1
77 49 244

[40000]
total=0

头文件

using namespace std;

struct LRopeSearch
{
bool Special;
int Counter;
string PN;
POINT XY;
};

struct LRopeData
{
int X;
int Y1;
int Y2;
};

struct LRData
{
int LRID;
vector <LRopeData> Ropes;
};

typedef pair <int, LRData> LRPair;
extern map <int, LRData> LRMap;

void CreateRopeStructure();

进展

通过我的 CreateRopeStructure() 函数,我将所有文本文件信息放入 LRopeData 结构中。

我需要一个使用三个整数值的函数; ID(例如 10000)、X(例如 -500)和 Y(例如 400)并使用所有三个整数值,将根据 ID、最接近的 X、Y1 和 Y2 值进行检索。

我有结构 LRopeSearch 可用于执行此操作,但我需要除此之外的帮助才能实际使用函数中的结构来检索所述值。

谢谢。

最佳答案

啊。花了一些时间来“想象”输入数据的含义。在您最后发表评论后,我现在了解到输入是由 ID 标识的几组(空)绳索。

绳索是由 (X, Y1)-(X, Y2) 给出的有限垂直线段。


我简化了数据结构,因为在 LRData 中包含 LRID 是多余的:

typedef int                    LRID;
typedef std::vector<LRopeData> LRData;
typedef std::map<LRID, LRData> LRMap;

现在假设您已经实现了数据读取(CreateRopeStructure),您可以编写一个强力搜索:

LRMap CreateRopeStructure();

#include <algorithm>
#include <iostream>

int main()
{
LRMap data = CreateRopeStructure();

// ex. from OP
int const ID = 10000;
int const X = -500;
int const Y = 400;

// select rope data by ID:
auto& ropes = data[ID];

if (ropes.empty())
{
std::cout << "infinite" << std::endl;
} else
{
// get the distance to each rope
std::vector<double> distances(ropes.size());
std::transform(
ropes.begin(), ropes.end(),
distances.begin(),
[=](LRopeData const& rope) { return rope.distanceToPoint(X, Y); });
// for c++03:
// std::tr1::bind(&LRopeData::distanceToPoint, std::tr1::placeholders::_1, X, Y));

// print the shortest distance
std::cout << *std::min_element(distances.begin(), distances.end()) << std::endl;
}
}

当然,最有趣的部分是:LRopeData::distanceToPoint:

struct LRopeData {
int X;
int Y1;
int Y2;

double distanceToPoint(double px, double py) const
{
int y1(Y1), y2(Y2);
// normalize segment endpoints (y1, y2)
if (y1>y2) std::swap(y1, y2);

double dx = (px - X);
double dy = 0;

if (py<y1) dy = (py - y1);
if (py > y2) dy = (py - y2);

return sqrt(dx * dx + dy * dy);
}
};

查看 Live On Coliru 打印的地方:

96.8401

OP中的查询

完整代码 list

包括我对解析输入的看法:

#include <vector>
#include <map>
#include <cmath>
//#include <tr1/functional> // bind (for c++03)

struct LRopeData {
int X;
int Y1;
int Y2;

double distanceToPoint(double px, double py) const
{
int y1(Y1), y2(Y2);
// normalize segment endpoints (y1, y2)
if (y1>y2) std::swap(y1, y2);

double dx = (px - X);
double dy = 0;

if (py<y1) dy = (py - y1);
if (py > y2) dy = (py - y2);

return sqrt(dx * dx + dy * dy);
}
};

typedef int LRID;
typedef std::vector<LRopeData> LRData;
typedef std::map<LRID, LRData> LRMap;
typedef std::pair<LRID, LRData> LRPair;

LRMap CreateRopeStructure();

#include <algorithm>
#include <iostream>

int main()
{
LRMap data = CreateRopeStructure();

// ex. from OP
int const ID = 10000;
int const X = -500;
int const Y = 400;

// select rope data by ID:
auto& ropes = data[ID];

if (ropes.empty())
{
std::cout << "infinite" << std::endl;
} else
{
// get the distance to each rope
std::vector<double> distances(ropes.size());
std::transform(
ropes.begin(), ropes.end(),
distances.begin(),
[=](LRopeData const& rope) { return rope.distanceToPoint(X, Y); });
// for c++03:
// std::bind(std::mem_fn(&LRopeData::distanceToPoint), std::placeholders::_1, X, Y));

// print the shortest distance
std::cout << *std::min_element(distances.begin(), distances.end()) << std::endl;
}
}

#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <fstream>
#include <cassert>

BOOST_FUSION_ADAPT_STRUCT(LRopeData, (int,X)(int,Y1)(int,Y2))

LRMap CreateRopeStructure()
{
// input
std::ifstream ifs("input.txt");
ifs >> std::noskipws;
typedef boost::spirit::istream_iterator It;
It f(ifs), l;

// grammar
using namespace boost::spirit::qi;
rule<It, LRPair(), blank_type, locals<int> > lrmap;

lrmap %= '[' >> int_ >> ']' >> +eol
>> "total" >> '=' >> omit [ int_ [ _a = _1 ] ] >> +eol
>> repeat(_a) [ int_ >> int_ >> int_ >> +eol ]
;

// parse
LRMap data;
assert(phrase_parse(f, l, +lrmap, blank, data));

if (f!=l)
std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";

// done
return data;
}

关于c++ - 检索结构中最接近的 X 和 Y 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com