#include <iostream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; vector<vector<float>> findStonePairs(const vector<float> &stones, float D) { vector<vector<float>> result; unordered_set<float> set; for (int i = 0; i < stones.size(); i++) { float target1 = stones[i] - D; if (set.count(target1)) { result.push_back(vector<float>{target1, stones[i]}); // weight } float target2 = stones[i] + D; if (set.count(target2)) { result.push_back(vector<float>{target2, stones[i]}); // weight } set.insert(stones[i]); } return result; } int main() { float d = 2; vector<float> weights_test1 = {1.2, 3.2, 1.3, 3.3, 6, 5.2}; vector<vector<float>> result_test1 = findStonePairs(weights_test1, d); cout << "test1:" << endl; for (int i = 0; i < result_test1.size(); i++) { for (int j = 0; j < result_test1[i].size(); j++) { cout << result_test1[i][j] << " "; } cout << endl; } return 1; }为什么结果与预期不同

时间: 2023-12-10 07:42:56 浏览: 27
可能是因为你在比较浮点数时使用了相等运算符,这在计算机中是不准确的。你可以使用一个足够小的数值epsilon来代替相等运算符,例如: ``` bool isEqual(float a, float b, float epsilon = 0.0001) { return fabs(a - b) < epsilon; } ``` 然后在比较浮点数时,使用这个函数来代替相等运算符。此外,你可能还需要按照一定的顺序对石头进行排序,以便在比较时能够保证正确的结果。
相关问题

优化这段代码#include <iostream> #include <iomanip> #include <stdio.h> #include <fstream> #include <string> #include <algorithm> #include <unordered_map> #include <map> #include <stack> #include <set> #include <vector> using namespace std; struct Production { char left; // 产生式的左部非终结符 string right; // 产生式的右部字符串 }; map<char, set<char>> firstSets; int main() { vector<Production> productions; ifstream infile("grammar.txt"); char left; string right; while (infile >> left >> right) { productions.push_back({ left, right }); } for (auto p : productions) { char left = p.left; string right = p.right; char firstChar = right[0]; if (isupper(firstChar)) { // 如果是非终结符 // 计算非终结符的first集合 set<char> firstSet = firstSets[firstChar]; for (int i = 0; i < right.length(); i++) { char ch = right[i]; if (isupper(ch)) { // 如果是非终结符 firstSet.insert(firstSets[ch].begin(), firstSets[ch].end()); if (firstSets[ch].find('$') == firstSets[ch].end()) { // 如果该非终结符没有空串 break; } } else { // 如果是终结符 firstSet.insert(ch); break; } } firstSets[left].insert(firstSet.begin(), firstSet.end()); } else { // 如果是终结符 firstSets[left].insert(firstChar); } } for (auto p : productions) { char left = p.left; cout << "First(" << left << ") = {"; for (auto ch : firstSets[left]) { cout << ch << ", "; } cout << "}" << endl; } }使得能正确求出frist集

以下是优化后的代码: ```c++ #include <iostream> #include <iomanip> #include <fstream> #include <string> #include <vector> #include <map> #include <set> using namespace std; // 产生式结构体 struct Production { char left; // 产生式的左部非终结符 string right; // 产生式的右部字符串 }; // 计算first集合 set<char> calcFirstSet(char ch, const vector<Production>& productions, map<char, set<char>>& firstSets) { // 如果该字符已经计算过first集合,直接返回 if (firstSets.find(ch) != firstSets.end()) { return firstSets[ch]; } set<char> result; // 遍历所有产生式,查找该字符作为左部的产生式 for (auto p : productions) { if (p.left == ch) { // 如果右部第一个字符是终结符,则加入该字符 if (!isupper(p.right[0])) { result.insert(p.right[0]); } // 如果右部第一个字符是非终结符,则计算该非终结符的first集合 else { set<char> subResult = calcFirstSet(p.right[0], productions, firstSets); result.insert(subResult.begin(), subResult.end()); // 如果该非终结符的first集合中包含空串,则计算下一个字符的first集合 for (int i = 1; i < p.right.length() && subResult.find('$') != subResult.end(); i++) { if (!isupper(p.right[i])) { result.insert(p.right[i]); break; } else { subResult = calcFirstSet(p.right[i], productions, firstSets); result.insert(subResult.begin(), subResult.end()); } } } } } // 将计算得到的first集合插入到map中 firstSets.insert(make_pair(ch, result)); return result; } int main() { vector<Production> productions; ifstream infile("grammar.txt"); // 读取产生式 char left; string right; while (infile >> left >> right) { productions.push_back({ left, right }); } map<char, set<char>> firstSets; // 计算每个非终结符的first集合 for (auto p : productions) { if (isupper(p.right[0])) { set<char> result = calcFirstSet(p.left, productions, firstSets); firstSets.insert(make_pair(p.left, result)); } else { firstSets.insert(make_pair(p.left, set<char>{p.right[0]})); } } // 输出每个非终结符的first集合 for (auto p : productions) { char left = p.left; cout << "First(" << left << ") = {"; for (auto ch : firstSets[left]) { cout << ch << ", "; } cout << "}" << endl; } } ``` 优化后的代码主要是将计算first集合的部分提取出来,封装成了一个函数`calcFirstSet`。在计算每个非终结符的first集合时,只需调用该函数进行计算即可。同时,在计算非终结符的first集合时,使用了递归的方式,可以很方便地计算出包含空串的情况。

优化#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;int main() { string code1 = "int main() {int a = 1; float b = 2.0; while(a < 10) {a++; if(a == 5) break;} return 0;}"; string code2 = "int main() {double x = 3.0; int y = 4; for(int i = 0; i < y; i++) {if(i % 2 == 0) continue; y--;}}"; vector<string> segments = {"{int a = 1", "while(a < 10)", "if(a == 5)", "int y = 4;", "for(int i = 0;", "if(i % 2 == 0)"}; int count = 0; for (int i = 0; i < segments.size(); i++) { if (code2.find(segments[i]) != string::npos) { count++; } } double plagiarism = (double)count / (double)segments.size(); cout << "抄袭概率:" << plagiarism << endl; if (plagiarism > 0.5) { cout << "可能存在抄袭行为!" << endl; } else { cout << "不存在抄袭行为。" << endl; } return 0;}

这段代码中可以进行一些优化: 1. 在使用 vector 存储子串的时候,可以使用常量数组来代替,这样可以节省一些内存空间。 2. 在循环中使用迭代器来遍历 vector,这样可以提高程序的效率。 3. 在判断子串是否存在的时候,可以使用 unordered_set 来代替 vector,这样可以更快地进行查找操作。 4. 在输出抄袭概率的时候,可以将小数点后面的数字格式化为固定位数,这样可以更加美观。 下面是优化后的代码: #include <iostream> #include <string> #include <unordered_set> using namespace std; int main() { string code1 = "int main() {int a = 1; float b = 2.0; while(a < 10) {a++; if(a == 5) break;} return 0;}"; string code2 = "int main() {double x = 3.0; int y = 4; for(int i = 0; i < y; i++) {if(i % 2 == 0) continue; y--;}}"; const string segments[] = {"{int a = 1", "while(a < 10)", "if(a == 5)", "int y = 4;", "for(int i = 0;", "if(i % 2 == 0)"}; int count = 0; unordered_set<string> segmentSet(segments, segments + 6); for (auto it = segmentSet.begin(); it != segmentSet.end(); ++it) { if (code2.find(*it) != string::npos) { count++; } } double plagiarism = (double)count / 6.0; cout.precision(3); // 设置输出小数点后三位 cout << "抄袭概率:" << fixed << plagiarism << endl; if (plagiarism > 0.5) { cout << "可能存在抄袭行为!" << endl; } else { cout << "不存在抄袭行为。" << endl; } return 0; }

相关推荐

优化改进以下代码#include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; typedef istream_iterator<string> string_input; void welcome() { cout << "******************* 变位词查找系统*********************\n" << "在词典中找出给定的字符串的所有变位词" << endl; } void readDict(vector<string> & dictionary) { cout << "首先,请输入词典的文件名称:" << endl; string dictionary_name; cin >> dictionary_name; ifstream ifs(dictionary_name.c_str()); if (!ifs.is_open()) { cerr << "异常:文件"<< dictionary_name << "没有找到 " << endl; exit(1); } cout << "词典读入中 ..." << flush; copy(string_input(ifs), string_input(), back_inserter(dictionary)); sort(dictionary.begin(),dictionary.end()); cout << "词典包含有 " << dictionary.size() << " 个单词\n\n"; ifs.close(); } void analyseAnagram(const vector<string> & dictionary) { cout << "请输入单词(或任意字母序列)" << endl; for (string_input p(cin); p != string_input(); ++p) { cout << "查找输入单词的变位词中..." << endl; string word = *p; sort(word.begin(), word.end()); bool found_one = false; do { if (binary_search(dictionary.begin(), dictionary.end(), word)) { cout << " " << word ; found_one = true; } } while (next_permutation(word.begin(), word.end())); if (!found_one) cout << " 抱歉,没有找到变位词\n"; cout << "\n请输入下一个单词 " << "(或输入Ctrl+Z终止程序 ) \n" << endl; } } int main() { welcome(); vector<string> dictionary; readDict(dictionary); analyseAnagram(dictionary); system("pause"); return 0; }

用c++完成步骤一.设计八数码格局的隐式存储的节点结构: 将表示棋局的状态用如下向量表示: A=(X0,X1 ,X2 ,X3 ,X4 ,X5 , X6 , X7 ,X8) 约束条件: XiÎ{0,1 ,2,3,4,5,6,7,8} Xi¹Xj,当i¹j时。 初始状态: S0 =(0,1,3,2,4,8,7,6,5) 目标状态: Sg =(0,1,2,3,4,5,6,7,8) 步骤二. 采用广度优先、深度优先搜索算法实现搜索。 步骤三. 设计启发函数,启发函数可参考如下定义方法: (1)启发函数h(n)定义为:h(n)=w(n) 其中,w(n)代表n的格局域目标节点格局相比,位置不符的将牌数目。 (2)估计函数f(n)定义为:f(n)=d(n)+w(n) 其中,d(n)表示节点深度,w(n)意义与前同。 (3)对w(n)进一步改进:令h(n)=P(n) 其中,p(n)是n格局中每个将牌离家(在sg中的位置)的最短距离。 (4)另一种改进:h(n)=p(n)+3s(n) 其中, s(n)是这样计算的:沿着周围哪些非中心方格上依顺时针方向检查n格局上的每一个将牌,如果其后紧跟着的将牌正好是目标格局中该将牌的后续者,则该将牌得0分,否则得2分;在正中方格上有将牌得1分,否则得0分 步骤四.选择并设计搜索算法。 (1)使用全局择优的树式搜索算法,即启发式的宽度优先搜索算法,但要考虑去掉已生成的格局。 (2)使用局部择优的树式搜索算法,即启发式的深度优先搜索算法,但要考虑去掉已生成的格局。 (3)使用A算法或A*算法,即图的启发式搜索算法,比上述两个算法略有难度。 步骤五 设计输出 动态演示格局的变化情况,即数码的移动情况。 步骤六 编写代码,调试程序。

最新推荐

recommend-type

王博外文文献.pdf

王博外文文献.pdf
recommend-type

基于 Go+Echo 开发的多房间实时通讯系统。.zip

Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
recommend-type

Qt调用Sqlite数据库

使用Qt自带的库来使用Sqlite数据库,实现增删查改功能; Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一,尤其是在一些嵌入式设备中,由于其小巧简洁而大量使用;
recommend-type

WHHA树洞的后端,基于Go语言.zip

Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB取整函数与Web开发的作用:round、fix、floor、ceil在Web开发中的应用

![MATLAB取整函数与Web开发的作用:round、fix、floor、ceil在Web开发中的应用](https://img-blog.csdnimg.cn/2020050917173284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2thbmdqaWVsZWFybmluZw==,size_16,color_FFFFFF,t_70) # 1. MATLAB取整函数概述** MATLAB取整函数是一组强大的工具,用于对数值进行
recommend-type

我想做python的算法工程师,我应该学什么?学习的顺序是什么?网上有什么推荐的免费课程吗?回答具体精确一点不要太笼统

对于想要成为 Python 算法工程师的人来说,他们应该先从掌握 Python 的基础语法开始,然后学习数据结构和算法,并且要深入了解 Python 中的一些科学计算和数据处理库,比如 NumPy、Pandas 等。 学习的顺序可以是先学习基础语法和编程技巧,然后再学习数据结构和算法相关的知识,最后深入了解数据处理和科学计算相关的库。 对于免费课程的推荐,我建议你可以先去 Coursera、edX、Udacity 等网站上寻找相关课程,这些网站上有很多优质的 Python 编程和算法课程,你可以根据自己的需求和学习进度进行选择。此外,还可以考虑一些在线编程网站,如 HackerRank、L
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依